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

使用 Spring Security

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

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

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

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

【问题讨论】:

    标签: spring-security spring-oauth2


    【解决方案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 的关键。
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2020-09-01
    相关资源
    最近更新 更多