代码之家  ›  专栏  ›  技术社区  ›  Johan Sjöberg

将请求信息传递给Spring AuthenticationProvider

  •  1
  • Johan Sjöberg  · 技术社区  · 8 年前

    如何将请求特定信息传递给 AuthenticationProvider 来自 Filter 不创建自定义 Authentication ?

    这个 身份验证提供程序 签名如下:

    interface AuthenticationProvider {
        Authentication authenticate(Authentication authentication);
    }
    

    我在想类似静电的东西 SecurityContextHolder.getContext().getAuthentication() 但具有请求特定信息。


    出身背景

    我之所以想要它,是因为我想实现一个切换身份验证提供者,它在运行时委托给另一个 身份验证提供程序

    public class SwitchingAuthenticationProvider implements AuthenticationProvider {
    
        private AuthenticationProvider[] authProviders = // ...
    
        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            return authProvider[GetCurrentContext.getIndex()].authenticate(authentication);
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Imrank    8 年前

    您可以提供自己的 AuthenticationEntryPoint 有权访问 HttpServletRequest 在里面 身份验证入口点 实现将您在切换中需要的所有属性 AuthenticationProvider 在里面 RequestContextHolder 如下所示

    RequestContextHolder.currentRequestAttributes().setAttribute(attributeName, attibuteValue, scope);
    

    最后,您可以在身份验证提供者中检索这些属性,如下所示

    RequestContextHolder.currentRequestAttributes().getAttribute(attributeName,scope);