Для начала нам нужно зарегистрировать 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 для загрузки собственной реализации 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 смог загрузить наш 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. Сперва необходимо добавить в него необходимые нам View:
getNavigator().addView(LoginView.NAME, LoginView.class); getNavigator().addView(MainView.NAME, MainView.class);
А затем перемещаться между ними, вызывая метод navigateTo:
getNavigator().navigateTo(LoginView.NAME);
Здесь я привел ключевые моменты, исходный код проекта доступен на GitHub.
А также демо.
Ссылки:
- Официальный сайт Apache TomEE
tomee.apache.org/index.html - Официальный сайт VAADIN
vaadin.com - JAAS and TomEE
tomee.apache.org/tomee-jaas.html - Security TomEE
tomee.apache.org/security.html - Creating a simple login view
vaadin.com/wiki/-/wiki/Main/Creating%20a%20simple%20login%20view
ссылка на оригинал статьи http://habrahabr.ru/post/183550/
Добавить комментарий