在 JBoss AS 7 上设置 Seam3-Security

最近,我对几个Java 安全框架做了一些研究,它们能实现认证、授权和加密技术。

我曾经为Apache Shiro贡献代码,它十分的棒。但是,我发现几个问题,比如没有默认执行的CDI安全注释拦截器。下面是一个我之前的执行和启动步骤。

很久以前,我用的是seam2-security,现在用seam3。下面开始:

  1. 开始,我从JBoss Maven模型创建了一个JavaEE6项目,
  2. 在你主项目中的Maven引用关系管理器中,添加:
    <dependency>
     <groupId>org.jboss.seam</groupId>
     <artifactId>seam-bom</artifactId>
     <version>3.1.0.Final</version>
     <scope>import</scope>
     <type>pom</type>
    </dependency>
    这可以确保我在整个项目中使用的seam-jar版本正确。
  3. 然后,在ejb项目中的引用关系管理器中,添加seam3-security的引用:
    <dependency>
     <groupId>org.jboss.seam.security</groupId>
     <artifactId>seam-security</artifactId>
     <scope>compile</scope>
    </dependency>
  4. 在Web项目中的WEB-INF文件夹中,新建一个beans.xml文件。这个文件也是CDI正常工作所必需的。这里,我们定义拦截机制:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:s="urn:java:ee" xmlns:security="
     urn:java:org.jboss.seam.security"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://jboss.org/schema/cdi/beans_1_0.xsd">
    
     <interceptors>
      <class>org.jboss.seam.security.SecurityInterceptor</class>
     </interceptors>
    
     <security:IdentityImpl>
      <s:modifies />
      <security:authenticatorClass>com.czetsuya.security.Authenticator
      </security:authenticatorClass>
     </security:IdentityImpl>
    
    </beans>
  5. 之后,我们要定义拦截类:
    package com.czetsuya.security;
    
    import javax.enterprise.inject.Model;
    import javax.inject.Inject;
    
    import org.jboss.seam.security.BaseAuthenticator;
    import org.jboss.seam.security.Credentials;
    import org.picketlink.idm.impl.api.PasswordCredential;
    import org.picketlink.idm.impl.api.model.SimpleUser;
    
    @Model
    public class Authenticator extends BaseAuthenticator {
     @Inject
     Credentials credentials;
    
     public Authenticator() {
    
     }
    
     @Override
     public void authenticate() {
      System.out.println("logging in: " + credentials.getUsername());
    
      if ("demo".equals(credentials.getUsername())
        && credentials.getCredential() instanceof PasswordCredential
        && "demo".equals
        (((PasswordCredential) credentials.getCredential()).getValue())) {
    
       setStatus(AuthenticationStatus.SUCCESS);
       setUser(new SimpleUser("demo"));
    
      }
    
     }
    
    }
  6. 要隐藏UI中的一个组件,你可以使用identity.hasPermissionoridentity.hasRole.
  7. 你可以从 Google code下载源代码。