代码之家  ›  专栏  ›  技术社区  ›  Shadowman

Soteria HttpMessageContext.setRegisterSession()没有按预期工作?

  •  6
  • Shadowman  · 技术社区  · 7 年前

    我已经实现了一个自定义 HttpAuthenticationMechanism 子类以使用 Soteria/Java EE Security 框架。我的身份验证工作很好。但是,我注意到当我打电话给 HttpMessageContext.setRegisterSession(String, Set<String>) 创建Java EE Session ,这种行为不是我所期望的。我希望经过身份验证的身份与web相关联 会议 ,和我的 AuthenticationMechanism validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext ctx) validateRequest() 对每个请求调用,即使用户已成功通过身份验证。

    我可以通过使用 @AutoApplySession 我的注释 认证机制 班级,但那不是我想要的行为。我想根据提供的凭据类型选择是否创建会话。

    我的理解是 setRegisterSession() 方法不正确?或者这是索特里亚的虫子?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Julius Zaldokas    7 年前

    @AutoApplySession 是在索特里亚的新方法吗( JSR 375 ). 如果它不适合您的需要(因为您需要记住经过身份验证的身份,或者在同一个HTTP会话期间基于某些其他凭据信息对所有请求重新进行身份验证), validateRequest 方法仍将被调用,无论您是否调用 HttpMessageContext setRegisterSession 方法与否。 HttpMessageContext.setRegisterSession 将使容器记住凭据,但不会自动重用它们,您仍然需要通过执行Soteria的相同操作使容器重用身份验证标识 AutoApplySessionInterceptor 做。所以在你的班级里 HttpAuthenticationMechanism 验证请求 方法:

    Principal userPrincipal = request.getUserPrincipal();
    
    if (userPrincipal != null) {   
        httpMessageContext.getHandler().handle(new Callback[] { 
                    new CallerPrincipalCallback(httpMessageContext.getClientSubject(), userPrincipal) }
                );
    
        return AuthenticationStatus.SUCCESS; 
    }
    

    还有,看这个 answer 作者:Arjan Tijms。虽然这是关于贾斯皮克而不是索特雷亚,但在这个案例中我认为这是相关的。 希望这有帮助。

        2
  •  1
  •   stefan    7 年前

    我想你是在跟踪不正确的来源你看到了这个 IMPLEMENTATION .

    /*  (non-Javadoc)
     *  @see javax.security.authenticationmechanism.http.HttpMessageContext#setRegisterSession(java.lang.String, java.util.Set)
     */
    @Override
    public void setRegisterSession(String username, Set<String> groups) {
      Jaspic.setRegisterSession(messageInfo, username, groups);
    }
    

    在库位置下:

    import org.glassfish.soteria.mechanisms.jaspic.Jaspic;
    

    mechanisms .

    推荐文章