我有一个由两个模块组成的J2EE应用程序:
应用程序部署在wildfly 8.2.0.Final中的EAR中 我需要使用存储在数据库中的用户信息来使用基本身份验证来保护REST api。
我正在尝试使用Apache Shiro 1.2来实现这个目的:我已经像这样修改了web.xml:
<!-- Resteasy configuration -->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
并在WEB-INF中添加了一个shiro.ini文件:
[main]
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager
userRealm=myapp.realm.UserRealm
securityManager.realms=$userRealm
[urls]
/* = authcBasic
然后定义了UserRealm类:
public class UserRealm extends AuthorizingRealm {
@EJB
AppUserController appUserController;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// ....
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
AppUser user = appUserController.findByUsername(username);
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user.getUsername(),
user.getPassword(),
null,
getName()
);
return authenticationInfo;
}
}
其中AppUserController是管理用户帐户的@Stateless
ejb。
现在我遇到了第一个(小)问题:在运行时,appUserController ejb始终为null。
我知道这是因为UserRealm实例不是托管对象,我通过JNDI获取实例来绕过它
InitialContext context = new InitialContext();
appUserController = (AppUserController) context.lookup("java:global/...../AppUserController");
但我想知道是否有办法使用托管的@EJB。
我尝试将UserRealm
设为@Stateless
,但它不起作用。
此外,我有另一个(主要)问题。我想访问ejb模块中的SecurityUtils.getSubject()
。有没有办法在同一个EAR内的多个模块之间共享shiro环境?
我读了很多例子,但我找不到完整的信息
先谢谢......