2013-03-25 19 views
5

Jestem nowy w Vaadin. Przed tym zrobiłem aplikację internetową JSF. Posiadałem ManagedBean wykonujący logowanie użytkownika. Użyłem sfery bezpieczeństwa do delegowania faktycznej weryfikacji danych uwierzytelniających.Uwierzytelnianie i uwierzytelnianie Vaadin

Jak to zrobić w Vaadin? Czy istnieje najlepsza praktyka? Jestem w punkcie, w którym chciałbym po prostu coś połączyć, ale musi być jakiś standardowy proces, prawda? Znalazłem kilka tutoriali na ten temat, ale głównie przy użyciu Spring (chcę używać EJB). Ponadto, każdy tutorial wydawał się niepotrzebnie skomplikowany.

Musi być jakiś prosty + ostateczny samouczek dotyczący czegoś tak powszechnego.

Odpowiedz

3

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,

1

Kilka miesięcy temu miałem taki sam problem. Wtedy nie byłem w stanie dowiedzieć się, jak to działa, więc przeszedłem wiosenny adddon i teraz używam formularza logowania Vaadin i sprężynowego zabezpieczenia

+0

Wielkie dzięki za odpowiedź. Pozostawię to pytanie otwarte, ponieważ ktoś może wymyślić rozwiązanie czysto Vaadin. – fancy

1

Pełne przykład, który wykorzystuje JAAS, Vaadin 8 Vaadin CDI dodatek i wbudowany LoginForm dostępne here kroki są następujące:

  1. Włącz Vaadin CDI dodatek w pom.xml
  2. Włącz CDI in Vaadin UI z @CDIUI adnotacji i skonfigurować Navigator
  3. Włącz authorization in a CDI view dodając @RolesAllowed adnotacji (lub innego javax.annotation.security adnotacja)
  4. Implementacja a login view, która pochodzi z wbudowanego LoginForm i używa JaasAccessControl do uwierzytelnienia użytkownika.

Jest to raczej przyjemne, płynne doświadczenie, gdy się zorientujesz, w jaki sposób elementy pasują do siebie.

Istnieje dłuższy artykuł w dokumencie Vaadin wiki, który wyjaśnia, w jaki sposób korzystać z uwierzytelniania opartego na bazie danych z JAAS.