Vaadin认证与Auhorization

Vaadin认证与Auhorization,vaadin,jaas,Vaadin,Jaas,我是瓦丁的新手。 在此之前,我制作了一个JSFWeb应用程序。 我有一个ManagedBean来执行用户的登录。我使用了一个安全域来委托凭证的实际验证 在瓦丁我该怎么做?是否有最佳实践? 我正处在这样一个点上,我只想把一些东西放在一起,但必须有某种标准的程序,不是吗!? 我找到了一些关于这方面的教程,但主要是使用Spring(我想使用EJB)。 而且,每个教程似乎都不必要复杂 对于如此常见的问题,必须有一些简单且结论性的教程。几个月前,我遇到了同样的问题。我当时无法弄清楚它到底是如何工作的,所以

我是瓦丁的新手。 在此之前,我制作了一个JSFWeb应用程序。 我有一个ManagedBean来执行用户的登录。我使用了一个安全域来委托凭证的实际验证

在瓦丁我该怎么做?是否有最佳实践? 我正处在这样一个点上,我只想把一些东西放在一起,但必须有某种标准的程序,不是吗!? 我找到了一些关于这方面的教程,但主要是使用Spring(我想使用EJB)。 而且,每个教程似乎都不必要复杂


对于如此常见的问题,必须有一些简单且结论性的教程。

几个月前,我遇到了同样的问题。我当时无法弄清楚它到底是如何工作的,所以我查看了spring adddon,现在我使用了一个Vaadin登录表单和spring security,这是我能找到的唯一一篇Vaadin官方文章,内容是关于如何保护a。我指的是本地或官方的瓦丁证券化。如果您使用SpringSecurity、Shiro稍微搜索一下,您会发现更多,但纯ESB使用JAAS。 我同意这篇文章不足以学习如何设置应用程序。我在这里分享我的经验:

1。瓦丁CDI扩展:

<!-- Vaadin Official DI support. -->
<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadin-cdi</artifactId>
  <version>1.0.0.alpha2</version>
</dependency>
4。使用登录用户的信息。

每当用户通过JAAS登录过滤器时。它将在他的请求上下文中提供一个标识他的类。该类称为Principal(您以前在LoginModule类中设置的类)

5。LoginModule的替代方案

创建自定义登录模块不是强制性的,通常JavaEE提供程序提供的实现很少。在某些数据库表中,基于属性文件的身份验证。 请查看以下示例:

6。在TomEE中启用JAAS 您需要创建一个引用LoginModule的jaas.config文件,例如:

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;
}
}
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

如果你想看看这个概念的证明,使用TOME、Vaadin 7、JAAS的完整示例使用JAAS、Vaadin 8、Vaadin CDI附加组件和内置的
LoginForm
,步骤如下:

  • pom.xml
  • 使用
    @CDIUI
    注释启用并配置
    导航器
  • 通过添加
    @RolesAllowed
    注释(或任何其他
    javax.annotation.security
    注释)启用
  • 从内置的
    LoginForm
    派生并使用
    JaasAccessControl
    对用户进行身份验证的实现
  • 事实上,一旦你弄清楚这些片段是如何组合在一起的,这是一次相当不错、流畅的体验


    中有一篇较长的文章解释了如何在JAAS中使用数据库支持的身份验证。

    非常感谢您的回答。我会把这个问题留待讨论,因为有人可能会提出一个纯瓦丁的解决方案。
    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;
        }
    
    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