如何在不创建自定义AuthenticationProvider
的情况下,将请求特定信息从Filter
传递给Authentication
?
AuthenticationProvider
签名如下:
interface AuthenticationProvider {
Authentication authenticate(Authentication authentication);
}
我正在考虑与静态SecurityContextHolder.getContext().getAuthentication()
类似的内容,但需要特定于请求的信息。
我想要它的原因是因为我想实现一个切换身份验证提供程序,该提供程序在运行时委托给另一个AuthenticationProvider
public class SwitchingAuthenticationProvider implements AuthenticationProvider {
private AuthenticationProvider[] authProviders = // ...
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
return authProvider[GetCurrentContext.getIndex()].authenticate(authentication);
}
}
答案 0 :(得分:0)
您可以提供自己的AuthenticationEntryPoint
实施,可以访问HttpServletRequest
。在AuthenticationEntryPoint
实施中,将AuthenticationProvider
中所需的所有属性放在RequestContextHolder
中,如下所示
RequestContextHolder.currentRequestAttributes().setAttribute(attributeName, attibuteValue, scope);
最后,您可以在身份验证提供程序中检索这些属性,如下所示
RequestContextHolder.currentRequestAttributes().getAttribute(attributeName,scope);