Shiro/CDI注入安全主体在Glassfish上工作,但在Wildfly上没有



我正在将一些代码从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拦截并重定向到登录页面
  • 用户输入凭据(username=admin)并提交页面
  • Shiro验证并重定向到原始页面
  • 将调用身份验证过滤器,并记录用户主体名称

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

-- 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教程似乎说我要做的是有效的:

每当访问注入的主体时,它总是表示当前调用者的标识。

所以我有点不知所措,不知道是什么在这里失败。

谢谢,

尝试使用:@资源负责人;相反

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

相关内容

最新更新