我已经实现了一个自定义的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中的错误?
答案 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。