Вот единственная официальная статья Vaadin о том, как защитить Vaadin aplication using JAAS что я мог найти. Я имею в виду родной или официальный Ваадинский секрет. Вы найдете больше, если вы немного поделитесь с безопасностью Spring, Сиро, но чистый ESB использует JAAS. Я согласен, что этой статьи недостаточно, чтобы узнать, как настроить приложение. Я здесь поделиться своим опытом:
1. Vaadin CDI расширения:
<!-- Vaadin Official DI support. -->
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-cdi</artifactId>
<version>1.0.0.alpha2</version>
</dependency>
2. Понимание о JAAS
Я предлагаю вам взглянуть, как JAAS работает в не- vaadin, прочитав обзорные статьи, поскольку JAAS зависит от поставщика сервера (TomEE, Jboss, Wildfly, Glasfish), у всех есть разные настройки конфигурации. Здесь вы найдете proof of concept с помощью Tomee.
3. Разработка собственного модуля входа.
Если вы решили создать собственный модуль входа в систему, например:
public class MyLoginModule implements LoginModule {
private CallbackHandler handler;
private Subject subject;
private UserPrincipal userPrincipal;
private RolePrincipal rolePrincipal;
private String login;
private List<String> userGroups;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
Map<String, ?> options) {
handler = callbackHandler;
this.subject = subject;
}
@Override
public boolean login() throws LoginException {
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("login");
callbacks[1] = new PasswordCallback("password", true);
try {
handler.handle(callbacks);
String name = ((NameCallback) callbacks[0]).getName();
String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
// Here we validate the credentials against some
// authentication/authorization provider.
// It can be a Database, an external LDAP, a Web Service, etc.
// For this tutorial we are just checking if user is "user123" and
// password is "pass123"
if (name != null && name.equals("admin") && password != null && password.equals("admin")) {
login = name;
userGroups = new ArrayList<String>();
userGroups.add("admin");
return true;
}
// If credentials are NOT OK we throw a LoginException
throw new LoginException("Authentication failed");
} catch (IOException e) {
throw new LoginException(e.getMessage());
} catch (UnsupportedCallbackException e) {
throw new LoginException(e.getMessage());
}
}
@Override
public boolean commit() throws LoginException {
userPrincipal = new UserPrincipal(login);
subject.getPrincipals().add(userPrincipal);
if (userGroups != null && userGroups.size() > 0) {
for (String groupName : userGroups) {
rolePrincipal = new RolePrincipal(groupName);
subject.getPrincipals().add(rolePrincipal);
}
}
return true;
}
@Override
public boolean abort() throws LoginException {
return false;
}
@Override
public boolean logout() throws LoginException {
subject.getPrincipals().remove(userPrincipal);
subject.getPrincipals().remove(rolePrincipal);
return true;
}
}
Reference его в META-INF/context.xml вашего приложения. Эти настройки предназначены для TomEE, но для похожих на glashfish или других файлов должно быть одинаково.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Realm className="org.apache.catalina.realm.JAASRealm" appName="myrealm" userClassNames="net.sf.jaas.auth.UserPrincipal"
roleClassNames="net.sf.jaas.auth.RolePrincipal" />
</Context>
Имейте в виду, что userClassNames и roleClassNames только простые Java Pojo но должен реализовывать java.security.Principal;
3. Включение JAAS в ваш Vaadin Войти Просмотр
Определите свою любимую форму входа в систему, используя Vaadin TextField и пароль, а также определить в вашем doLoginEvent() а ссылки на JAAS. Когда вызывается JaasAccessControl.login, будет создан новый экземпляр вашего LoginModule.
import com.vaadin.cdi.access.JaasAccessControl;
try {
JaasAccessControl.login(loginEvent.getUsername(), loginEvent.getPassword());
logger.info("User {} authenticated", getPrincipalName());
navigator.navigateTo(Main.NAME);
} catch (Exception e) {
Notification.show("Error logging in", Type.ERROR_MESSAGE);
logger.error(e.getMessage(), e);
}
4. Использование информации вашего зарегистрированного пользователя.
Всякий раз, когда пользователь передает фильтр входа JAAS. В его запросе будет доступен класс, который идентифицирует его. Этот класс называется Principal (тот, который вы ранее задали в классе LoginModule).
public boolean isUserInRole(String role) {
return JaasAccessControl.getCurrentRequest().isUserInRole(role);
}
public String getPrincipalName() {
Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal();
if (principal != null) {
return principal.getName();
}
return null;
}
public boolean isUserSignedIn() {
Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal();
return principal != null;
}
5. Альтернативы LoginModule
Это не обязательно, чтобы создать свой собственный логин модуль, как правило, провайдеры Java EE как Tomee поставку нескольких реализации. Аутентификация на основе файла свойств в некоторых таблицах базы данных. Посмотрите на Tomee documentation JAAS, чтобы увидеть некоторые примеры:
6. Включить JAAS в TomEE Вам нужно создать файл jaas.config, который ссылается на вас LoginModule, например:
filename: jaas.config
myrealm{
net.sf.jaas.MyLoginModule required;
};
Затем начните сервер приложений с этим параметром:
-Djava.security.auth.login.config=E:/apache-tomee-jaxrs-1.6.0.2/conf/jaas.config
Если вы хотите увидеть доказательство концепции этого. Checkout this example, который использует Tomee, Vaadin 7, JAAS,
Большое спасибо за ваш ответ. Я оставлю этот вопрос открытым, потому что кто-то может придумать чистое решение Ваадина. – fancy