在多个模块之间共享shiro环境

时间:2014-12-15 20:32:25

标签: java java-ee authentication wildfly shiro

我有一个由两个模块组成的J2EE应用程序:

  • EJB模块,具有实现应用程序业务逻辑的类。它使用JPA进行数据持久化。
  • 使用JAX-RS(RestEasy)构建WAR模块,该模块实现RESTFul服务以与我的ejbs交互。

应用程序部署在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环境? 我读了很多例子,但我找不到完整的信息

先谢谢......

0 个答案:

没有答案