如何根据授权服务器的传入 URL 配置多个身份验证管理器?

Posted

技术标签:

【中文标题】如何根据授权服务器的传入 URL 配置多个身份验证管理器?【英文标题】:How can I configure multiple authentication managers depending on the incoming URL for an authorization server? 【发布时间】:2021-12-11 15:46:31 【问题描述】:

使用 Spring Security

在遗留项目中,对于密码授予场景,我需要配置授权服务器。

目前已完成对AuthorizationServerConfigurerAdapter 的扩展,并且授权端点配置为覆盖configure(AuthorizationEndpointsServerConfigurer) 方法。

我的问题是这个配置器需要一个AuthenticationManager 来授予密码,而我需要一个AuthenticationManagerResolver 之类的东西(但我无法升级到 5.2)能够根据传入的 URL 应用不同的身份验证(管理员 URL 的身份验证管理器,例如“/admin/**”,以及非管理员的另一个身份验证管理器)。

我该怎么做?我可以改变方法,但我又不能升级。

【问题讨论】:

【参考方案1】:

您可以尝试实现自己的 DelegatingAuthenticationManager,将您的 AuthenticationManagers 列表注入其中,并将您的逻辑放入 authenticate 方法中。例如:

@Component("delegatingAM")
public class DelegatingAuthenticationManager implements AuthenticationManager 
    private final List<AuthenticationManager> ams;

    @Autowire
    public DelegatingAuthenticationManager(@Qualifier("x") AuthenticationManager amX, @Qualifier("y") AuthenticationManager amY) 
        this.ams = List.of(amX, amY); // Arrays.asList(amX, amY);
        // you can inject variables for your conditions here 
    

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException 
         if (...) this.ams.get(0).authenticate(authentication);
         if (...) this.ams.get(0).authenticate(authentication);
         // Or you can loop over the list like AuthenticationManager is implemented with AuthenticatioProvider
    

然后注入到AuthorizationServerConfigurerAdapter

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter 
    @Autowired
    @Qualifier("delegatingAM")
    private AuthenticationManager authenticationManager;
    
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
        endpoints
                .authenticationManager(this.authenticationManager)
    
    ...

希望它会有所帮助,对于更糟糕的情况,您可以开始考虑使用多个 AuthorizationServerSecurityFilterChains,每个 AuthenticationManager。并根据 URL,将请求指向右侧SecurityFilterChain

【讨论】:

您好,感谢您抽出宝贵时间,您将如何访问请求以便能够编写 if 条件来选择合适的经理? 关于你提到的另一个解决方案,你能举个例子吗? :) 对不起,我忘记了最重要的部分,条件是在请求上。关于第二种方式,理想情况下,它最适合您遵循弹簧安全理论的情况,但我之前没有尝试过,当我这样做时,Basic、Oauth、Saml2 每个只有 3 个SecurityFilterChains过去的遗留项目,而不是 2 Oauth 作为您的案例。再次抱歉。希望其他人可以帮助你,祝你好运! 如果您可以更改预定义的AuthorizationServerSecurityConfiguration 或找到配置HttpSecurity#requestMatchers 的内容,那就太好了,这是在您的应用程序中创建2 个或更多SecurityFilterChain 的关键。

以上是关于如何根据授权服务器的传入 URL 配置多个身份验证管理器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在传入的http请求标头中添加授权令牌[关闭]

WCF 客户端证书验证 + Windows 身份验证

401 未经授权的错误 web api mvc windows 身份验证

如何在微服务和 API 网关架构中对不同的配置文件进行身份验证和授权

如何在 Wildfly 中提供自定义身份验证/授权管理器

Shiro 和 CAS 如何使用不同的域进行身份验证和授权?