我已经实现了自定义 HttpAuthenticationMechanism
使用 Soteria/Java EE Security 提供身份验证的子类框架。我的身份验证工作正常。但是,我注意到当我调用 HttpMessageContext.setRegisterSession(String, Set<String>)
时创建 Java EE Session
,这种行为不是我所期望的。我希望经过身份验证的身份与网络相关联 Session
,还有我的 AuthenticationMechanism
的 validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext ctx)
后续请求不会调用该方法。然而,我观察到的是 validateRequest()
在每个请求上调用,即使用户已经成功通过身份验证也是如此。
我可以使用 @AutoApplySession
获得我想要的行为我的注释AuthenticationMechanism
类,但这不是我想要的行为。我想根据提供的凭据类型选择是否创建 session 。
是我理解的setRegisterSession()
方法不对?或者这是 Soteria 中的错误?
最佳答案
@AutoApplySession
是在 Soteria ( JSR 375 ) 中执行此操作的新方法。如果它不符合您的需求(因为您需要记住经过身份验证的身份或根据其他凭据信息在同一 HTTP session 期间对所有请求重新进行身份验证),validateRequest
方法仍将被调用,无论您是否调用 HttpMessageContext
的 setRegisterSession
方法。 HttpMessageContext.setRegisterSession
将使容器记住凭据但不会自动重用它们,您仍然需要通过执行与 Soteria 的 AutoApplySessionInterceptor
相同的操作来使容器重用身份验证身份.因此,在实现 HttpAuthenticationMechanism
的类中,您应该在 validateRequest
方法中执行实际身份验证逻辑之前添加以下代码:
Principal userPrincipal = request.getUserPrincipal();
if (userPrincipal != null) {
httpMessageContext.getHandler().handle(new Callback[] {
new CallerPrincipalCallback(httpMessageContext.getClientSubject(), userPrincipal) }
);
return AuthenticationStatus.SUCCESS;
}
另请参阅此 answer由 Arjan Tijms 创作。虽然它是关于 JASPIC 而不是 Soteria,但在这种情况下我认为它是相关的。 希望这可以帮助。
关于java - Soteria HttpMessageContext.setRegisterSession() 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51678821/