Soteria HttpMessageContext.setRegisterSession()不能按预期工作?

时间:2018-08-03 19:14:26

标签: java security session authentication java-ee

我已经实现了一个自定义的HttpAuthenticationMechanism子类,以使用Soteria/Java EE Security框架提供身份验证。我的身份验证工作正常。但是,我注意到,当我调用HttpMessageContext.setRegisterSession(String, Set<String>)来创建Java EE Session时,行为不是我所期望的。我期望将经过身份验证的身份与网络Session关联,并且我的AuthenticationMechanism的{​​{1}}方法不会在后续请求中调用。但是,我观察到的是,即使用户已经成功进行身份验证,也会在每个请求上调用validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext ctx)

我可以在validateRequest()类上使用@AutoApplySession批注来获得所需的行为,但这不是我想要的行为。我想根据提供的凭证类型选择是否创建会话。

我对AuthenticationMechanism方法的理解不正确吗?还是这是Soteria中的错误?

2 个答案:

答案 0 :(得分:4)

@AutoApplySession是在Soteria(JSR 375)中执行此操作的新方法。如果它不符合您的需求(由于您需要记住已认证的身份或基于其他凭据信息在同一HTTP会话中对所有请求进行重新认证),则无论如何,validateRequest方法仍将被调用是否调用HttpMessageContext的{​​{1}}方法。 setRegisterSession将使容器记住凭据,但不会自动重用它们,您仍然需要通过执行Soteria的HttpMessageContext.setRegisterSession来使容器重用身份验证身份。因此,在实现AutoApplySessionInterceptor的类中,应在HttpAuthenticationMechanism方法中执行实际的身份验证逻辑之前,添加以下代码:

validateRequest

另外,请参见Arjan Tijms的answer。尽管与JASPIC有关而不是与Soteria有关,但是在这种情况下,我认为这是相关的。 希望这可以帮助。

答案 1 :(得分:1)

我想您所跟踪的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