- PVSM.RU - https://www.pvsm.ru -

Использование JAAS для web-приложений на VAADIN + TomEE

Мне бы хотелось рассказать о применении JAAS (Java Authentification and Authorization Service) для web-приложений использующих VAADIN 7 (в качестве web-фреймворка) и Apach TomEE (в качестве Java EE контейнера).

Для начала нам нужно зарегистрировать realm в контейнере и ассоциировать с ним LoginModule.
Сделать это можно либо в файле server.xml контейнера, либо в файле приложения /src/main/webapp/META-INF/context.xml:

<Realm className="org.apache.catalina.realm.JAASRealm" appName="ServiceLoginModule"
           userClassNames="org.apache.openejb.core.security.jaas.UserPrincipal"
           roleClassNames="org.apache.openejb.core.security.jaas.GroupPrincipal">
</Realm>

Конфигурация для ServiceLoginModule находится в файле login.config

 ServiceLoginModule {
    org.apache.openejb.core.security.jaas.ServiceProviderLoginModule required;
};

Для него нужно установить системное свойство в
CATALINA_OPTS: -Djava.security.auth.login.config=$CATALINA_BASE/conf/login.config

Или же сделать это непосредственно в коде приложения:

System.setProperty("java.security.auth.login.config", “yourPath/login.config");

У TomEE есть несколько реализаций LoginModule:

  • PropertiesLoginModule отображает пользователей и групп в двух файлах(users.properties и groups.properties);
  • SQLLoginModule использует таблицы базы данных;
  • ServiceProviderLoginModule использует ServiceLoader [1] для загрузки собственной реализации LoginProvider’a;
  • ScriptLoginModule использует Java Scripting API.

Мы будем использовать ServiceProviderLoginModule и напишем собственную реализацию LoginProvider’a:

public class SimpleLoginProvider implements LoginProvider {
	@Override
	public List<String> authenticate(String user, String password) throws FailedLoginException {
		if ("admin".equals(user) && "admin".equals(password)) {
            return Arrays.asList("ADMIN");
        }
		if ("user".equals(user) && "user".equals(password)) {
            return Arrays.asList("USER");
        }
        throw new FailedLoginException();
	}

}

Он содержит метод authenticate, который возвращает список ролей для того или иного успешного аутентифицированного пользователя. В нашем случае реализация этого метода довольна проста (чтобы показать как работает данный механизм и управление правами доступа), имеется всего два пользователя admin и user, получающие после успешного прохождения аутентификации роли ADMIN и USER соответственно.
Теперь мы можем воспользоваться аннотацией @RolesAllowed("ADMIN"), например, и ограничить доступ к какому-либо методу:

@Stateless
public class TestBean {
	@RolesAllowed("ADMIN")
	public String getProtectedInfo() {
		return "It's protected information.";
	}
}

Для того, чтобы ServiceLoader [1] смог загрузить наш LoginProvider, необходимо создать файл org.apache.openejb.core.security.jaas.LoginProvider в каталоге проекта /src/main/resources/META-INF/services/, который содержит полное имя нашего LoginProvider’a:

org.psa.vaadinauth.secure.SimpleLoginProvider

Напрямую нам не придется вызывать метод authenticate, это сделает контейнер после вызова метода login из HttpServletRequest’a. После заполнения web-формы для авторизации мы будем вызывать вот такой метод:

public void login(String user, String password, HttpServletRequest request) throws ServletException {
		request.login(user, password);
	}

У Vaadin’a есть свой VaadinService, содержащий статический метод getCurrentRequest, который, преобразовав в HttpServletRequest мы и будем передавать в наш метод login:

login(username, password, (HttpServletRequest) VaadinService.getCurrentRequest());

Для редиректа и навигации между страницами в Vaadin’e есть очень удобный компонент Navigator [2]. Сперва необходимо добавить в него необходимые нам View:

getNavigator().addView(LoginView.NAME, LoginView.class);
getNavigator().addView(MainView.NAME, MainView.class);

А затем перемещаться между ними, вызывая метод navigateTo:

getNavigator().navigateTo(LoginView.NAME);

Здесь я привел ключевые моменты, исходный код проекта доступен на GitHub [3].

А также демо [4].

Ссылки:

  1. Официальный сайт Apache TomEE
    tomee.apache.org/index.html [5]
  2. Официальный сайт VAADIN
    vaadin.com [6]
  3. JAAS and TomEE
    tomee.apache.org/tomee-jaas.html [7]
  4. Security TomEE
    tomee.apache.org/security.html [8]
  5. Creating a simple login view
    vaadin.com/wiki/-/wiki/Main/Creating%20a%20simple%20login%20view [9]

Автор: psa

Источник [10]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/36698

Ссылки в тексте:

[1] ServiceLoader: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

[2] Navigator: https://vaadin.com/book/vaadin7/-/page/advanced.navigator.html

[3] GitHub: https://github.com/sergpetrov/VaadinAuth

[4] демо: http://vaadinauth.jelastic.servint.net/

[5] tomee.apache.org/index.html: http://tomee.apache.org/index.html

[6] vaadin.com: https://vaadin.com

[7] tomee.apache.org/tomee-jaas.html: http://tomee.apache.org/tomee-jaas.html

[8] tomee.apache.org/security.html: http://tomee.apache.org/security.html

[9] vaadin.com/wiki/-/wiki/Main/Creating%20a%20simple%20login%20view: https://vaadin.com/wiki/-/wiki/Main/Creating%20a%20simple%20login%20view

[10] Источник: http://habrahabr.ru/post/183550/