Oto jedyny oficjalny artykuł Vaadin na temat sposobu zabezpieczenia Vaadin aplication using JAAS, które mogłem znaleźć. Mam na myśli rodzimą lub oficjalną sekcję Vaadin. Znajdziesz więcej, jeśli trochę google ze Spring Security, Shiro, ale czysty ESB używa JAAS. Zgadzam się, że ten artykuł nie wystarczy, aby dowiedzieć się, jak skonfigurować aplikację. I tutaj podzielić się moim doświadczeniem:
1. Vaadin CDI rozszerzenia:
<!-- Vaadin Official DI support. -->
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-cdi</artifactId>
<version>1.0.0.alpha2</version>
</dependency>
2. zrozumienia JAAS
proponuję rzucić okiem jak JAAS pracuje w nie- vaadin application, czytając artykuły przeglądowe, ponieważ JAAS zależy od dostawcy aplikacji Server (TomEE, Jboss, Wildfly, Glasfish) mają różne ustawienia konfiguracji. Tutaj znajdziesz proof of concept używając Tomee.
3. Opracowanie własnego modułu logowania.
Jeśli zdecydowaliśmy się utworzyć niestandardowy moduł logowania dla przykładu:
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;
}
}
referencyjny go w META-INF/context.xml aplikacji. Te ustawienia są dla TomEE, ale dla muszli i innych muszą być podobne.
<?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>
Należy pamiętać, że userClassNames i roleClassNames to tylko prosty Java Pojo ale musi wdrożyć java.security.Principal;
3. Włączanie JAAS do swojej Vaadin Logowanie Zobacz
Określ swój ulubiony formularza logowania, korzystając Vaadin TextField i hasło, a następnie określ w doLoginEvent (i) odniesień do JAAS. Po wywołaniu funkcji JaasAccessControl.login zostanie utworzona nowa instancja modułu logowania.
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. Korzystanie z informacji o swojej zalogowanego użytkownika.
Ilekroć użytkownik przekazuje filtr logowania JAAS. Będzie on dostępny w jego kontekście prośby o klasę, która go identyfikuje. Ta klasa nazywa się Principal (ta, którą wcześniej ustawiłeś w klasie 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. Alternatywy LoginModule
To nie jest obowiązkowe, aby utworzyć niestandardowy moduł logowania, zwykle dostawcy Java EE jak Tomee dostarczyć kilka realizacji. Uwierzytelnianie na podstawie pliku właściwości, w niektórych tabelach bazy danych. rzucić okiem na Tomee documentation JAAS zobaczyć kilka przykładów:
6. Włącz JAAS w TomEE Musisz utworzyć plik jaas.config który odwołuje Ci LoginModule, na przykład:
filename: jaas.config
myrealm{
net.sf.jaas.MyLoginModule required;
};
Następnie uruchom serwer aplikacji o tym parametrze:
-Djava.security.auth.login.config=E:/apache-tomee-jaxrs-1.6.0.2/conf/jaas.config
Jeśli chcesz mieć dowód na to. Checkout this example, który wykorzystuje Tomee, Vaadin 7 JAAS,
Wielkie dzięki za odpowiedź. Pozostawię to pytanie otwarte, ponieważ ktoś może wymyślić rozwiązanie czysto Vaadin. – fancy