Shiro / CDI 注入安全主体适用于 Glassfish 但不适用于 Wildfly

Posted

技术标签:

【中文标题】Shiro / CDI 注入安全主体适用于 Glassfish 但不适用于 Wildfly【英文标题】:Shiro / CDI inject security principal works on Glassfish but not on Wildfly 【发布时间】:2016-08-27 07:31:33 【问题描述】:

我正在将一些代码从 Glassfish 4.1 移植到 Wildfly 10,并且在 Shiro / CDI 和 java.security.Principal 之间遇到问题。

import java.security.Principal;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

// simple user interface
public interface User 
  public String getId();


// user bean
@Named("user")
@SessionScoped
public class UserBean implements User, Serializable 

  private Principal principal;

  @Inject
  private void initialise(Principal principal) 
    this.principal = principal;
  

  @Override
  public String getId() 
    return principal.getName();
  



// auth filter runs after shiro filters
public class AuthFilter implements javax.servlet.Filter 

  @Inject
  private User user;

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    log.debug("doFilter: user=", user.getId());
    ...
  


会发生什么:

用户请求安全页面。 Shiro 拦截并重定向到登录页面。 用户输入凭据(用户名 = admin)并提交页面。 Shiro 进行身份验证并重定向到原始页面。 身份验证过滤器被调用,并记录用户主体名称。

问题在于,在 Glassfish 中,记录的主体名称是从登录页面提交的(正确)名称。然而,Wildfly 似乎仍然拥有匿名用户。查看日志,两个系统的日志是相同的,包括 Shiro 验证用户 ID 的第 4 行:Authentication successful for token ... admin。只有最后一行不同:

-- both
[org.apache.shiro.realm.AuthenticatingRealm] AuthenticationInfo caching is disabled for info [admin].  Submitted token: [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false (127.0.0.1)].
[org.apache.shiro.authc.credential.SimpleCredentialsMatcher] Performing credentials equality check for tokenCredentials of type [[C and accountCredentials of type [java.lang.String]
[org.apache.shiro.authc.credential.SimpleCredentialsMatcher] Both credentials arguments can be easily converted to byte arrays.  Performing array equals comparison
[org.apache.shiro.authc.AbstractAuthenticator] Authentication successful for token [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false (127.0.0.1)].  Returned account [admin]
[org.apache.shiro.subject.support.DefaultSubjectContext] No SecurityManager available in subject context map.  Falling back to SecurityUtils.getSecurityManager() lookup.
[org.apache.shiro.mgt.DefaultSecurityManager] Context already contains a session.  Returning.
[org.apache.shiro.subject.support.DefaultSubjectContext] No SecurityManager available in subject context map.  Falling back to SecurityUtils.getSecurityManager() lookup.
[org.apache.shiro.web.servlet.SimpleCookie] Added HttpServletResponse Cookie [rememberMe=deleteMe; Path=/tools; Max-Age=0; Expires=Sun, 01-May-2016 10:24:02 GMT]
[org.apache.shiro.mgt.AbstractRememberMeManager] AuthenticationToken did not indicate RememberMe is requested.  RememberMe functionality will not be executed for corresponding account.

-- glassfish
[com.example.servlet.AuthFilter] doFilter: user=admin

-- wildfly
[com.example.servlet.AuthFilter] doFilter: user=anonymous

Java EE 7 Tutorial 似乎表明我正在尝试做的事情是有效的:

每当访问注入的主体时,它总是代表 当前调用者的身份。

所以我对这里失败的地方有点迷茫。

谢谢,

【问题讨论】:

你有任何更新吗?我也有类似的问题。 @Dalton 不,整个项目都被搁置了,所以我们把它留在了 Glassfish 上。干杯。 【参考方案1】:

尝试使用: @Resource Principal 校长; 而是。

https://docs.oracle.com/javaee/7/tutorial/cdi-adv004.htm

【讨论】:

以上是关于Shiro / CDI 注入安全主体适用于 Glassfish 但不适用于 Wildfly的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot整合Shiro

启用 CDI 的 shiro 过滤器

如何使用 CDI 进行方法参数注入?

CDI feature

CDI Features

Shiro 安全框架