带有oauth2的春季安全
我的旧安全配置代码基于Spring Boot 2.6工作正常:
@Configuration @EnableWebSecurity
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
. . .
.and()
.oauth2ResourceServer()
.jwt();
}
}
我现在正在升级不推荐使用的 websecurityConfigurerAdapter
类,而有利于使用 @bean@bean
return return return 的方法SecurityFilterChain
authenticationEventPublisher :
@Configuration @EnableWebSecurity
public class ResourceServerConfig {
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
. . .
.and()
.oauth2ResourceServer()
.jwt();
return http.build();
}
}
我的问题的原因是:对象 bearerTokenAuthenticationFilter
use providermanager
as autheation> authetication> authenticationManager (甚至在使用
WebSecurityConfigurerAdapter
之前)。
,如默认 providerManager
声明其 authenticationEdticationEventPublisher
以这种方式:
public class ProviderManager implements AuthenticationManager, . . . {
. . .
private AuthenticationEventPublisher eventPublisher = new NullEventPublisher();
存在问题:NulleventPublisher是一个不发布事件的无效实现。
但是 在使用 WebsecurityConfigurerAdapter
- providerManager
的EventPublisher对象被分配给 defaultauthatectionEventPublisher
对象,
在一些测试之后,我能够“解决问题”,我能够“解决问题”。以下代码:
@Configuration
@ConditionalOnClass({AuthenticationEventPublisher.class, JwtAuthenticationProvider.class})
public class SpringConfiguration { //global configuration for several others
@Bean
public ProviderManager providerManagerAvecDefaultAuthenticationPublisher(@Lazy JwtDecoder jwtDecoder, AuthenticationEventPublisher authenticationPublisher) {
JwtAuthenticationProvider authenticationProvider = new JwtAuthenticationProvider(jwtDecoder);
ProviderManager providerManager = new ProviderManager(Arrays.asList(authenticationProvider));
providerManager.setAuthenticationEventPublisher(authenticationPublisher);
return providerManager;
}
}
还调整我的安全配置:
@Configuration @EnableWebSecurity
public class ResourceServerConfig {
@Autowired ProviderManager manager; //1
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
. . .
.and()
.oauth2ResourceServer()
.jwt()
.authenticationManager(manager); //2
return http.build();
}
}
但是我有两个问题:
- 我的模块/应用程序的目的应由我公司的其他应用程序使用,以发布特定的日志。并且该解决方案将强制数十个应用程序以注释1和2添加行,
- 我不知道“强迫”这些应用程序“强迫”预先构建的
providermanager
为这些应用程序
>是否有一种方法可以绕过 eventPublisher = new NulleventPublisher()
来自 ProvidManager
而无需强迫配置 oauth2resourceserver()。配置其
SecurityFilterChain
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看起来您对默认
authenticationEventPublisher
的假设不正确。In fact, the default one (
DefaultAuthenticationEventPublisher
) is provided via the Spring Security autoconfiguration:org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration#authenticationEventPublisher()
.< br>然后,它是由
authenticationConfiguration
创建authenticationManagerBuilder
的,该 在请求中创建了提到的providermanager
,并使用填充的事件发布者创建。It doesn't look like your assumption about the default
AuthenticationEventPublisher
is correct.In fact, the default one (
DefaultAuthenticationEventPublisher
) is provided via the Spring Security autoconfiguration:org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration#authenticationEventPublisher()
.Then it's picked up by
AuthenticationConfiguration
which creates anAuthenticationManagerBuilder
which upon request creates the mentionedProviderManager
with the populated event publisher.