如何根据授权服务器的传入 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
,将您的 AuthenticationManager
s 列表注入其中,并将您的逻辑放入 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)
...
希望它会有所帮助,对于更糟糕的情况,您可以开始考虑使用多个 AuthorizationServerSecurityFilterChain
s,每个 AuthenticationManager
。并根据 URL,将请求指向右侧SecurityFilterChain
。
【讨论】:
您好,感谢您抽出宝贵时间,您将如何访问请求以便能够编写 if 条件来选择合适的经理? 关于你提到的另一个解决方案,你能举个例子吗? :) 对不起,我忘记了最重要的部分,条件是在请求上。关于第二种方式,理想情况下,它最适合您遵循弹簧安全理论的情况,但我之前没有尝试过,当我这样做时,Basic、Oauth、Saml2 每个只有 3 个SecurityFilterChain
s过去的遗留项目,而不是 2 Oauth 作为您的案例。再次抱歉。希望其他人可以帮助你,祝你好运!
如果您可以更改预定义的AuthorizationServerSecurityConfiguration
或找到配置HttpSecurity#requestMatchers
的内容,那就太好了,这是在您的应用程序中创建2 个或更多SecurityFilterChain
的关键。以上是关于如何根据授权服务器的传入 URL 配置多个身份验证管理器?的主要内容,如果未能解决你的问题,请参考以下文章
401 未经授权的错误 web api mvc windows 身份验证