2013-03-25 3 views
5

Я новичок в Vaadin. До этого я сделал веб-приложение JSF. У меня был ManagedBean, выполняющий логин пользователя. Я использовал область безопасности для делегирования фактической проверки учетных данных.Vaadin Authentication and Auhorization

Как это сделать в Ваадине? Есть ли наилучшая практика? Я нахожусь в точке, где я бы просто положил что-то вместе, но должна быть какая-то стандартная процедура, не так ли ?? Я нашел несколько уроков по этому вопросу, но в основном использовал Spring (я хочу использовать EJB). Кроме того, каждый учебник казался излишне сложным.

Должен быть какой-то простой + убедительный учебник для чего-то такого общего.

ответ

3

Вот единственная официальная статья 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,

1

Я столкнулся с той же проблемой пару месяцев назад. Тогда я не мог понять, как это работает, поэтому я перешел к весеннему аддону, и теперь я использую форму входа в систему Vaadin и весеннюю безопасность.

+0

Большое спасибо за ваш ответ. Я оставлю этот вопрос открытым, потому что кто-то может придумать чистое решение Ваадина. – fancy

1

Полный пример, использующий JAAS, Vaadin 8, Vaadin CDI дополнения и встроенный LoginForm доступен here, меры заключаются в следующем:

  1. Включить Vaadin CDI дополнения в pom.xml
  2. Включить CDI in Vaadin UI с @CDIUI аннотаций и настроить Navigator
  3. Включить authorization in a CDI view путем добавления @RolesAllowed аннотацию (или любой другой javax.annotation.security аннотация)
  4. Внесите a login view, который происходит из встроенного LoginForm и использует JaasAccessControl для аутентификации пользователя.

На самом деле это довольно приятное, свободное время, когда вы выясняете, как фигуры подходят друг другу.

В статье Vaadin wiki содержится более подробная статья, в которой объясняется, как использовать аутентификацию с поддержкой базы данных с помощью JAAS.