最近,我对几个Java 安全框架做了一些研究,它们能实现认证、授权和加密技术。
我曾经为Apache Shiro贡献代码,它十分的棒。但是,我发现几个问题,比如没有默认执行的CDI安全注释拦截器。下面是一个我之前的执行和启动步骤。
很久以前,我用的是seam2-security,现在用seam3。下面开始:
- 开始,我从JBoss Maven模型创建了一个JavaEE6项目,
- 在你主项目中的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版本正确。 - 然后,在ejb项目中的引用关系管理器中,添加seam3-security的引用:
<dependency> <groupId>org.jboss.seam.security</groupId> <artifactId>seam-security</artifactId> <scope>compile</scope> </dependency>
- 在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>
- 之后,我们要定义拦截类:
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")); } } }
- 要隐藏UI中的一个组件,你可以使用identity.hasPermissionoridentity.hasRole.
- 你可以从 Google code下载源代码。