spring - 在 WebSecurityConfigurerAdapter 中为 Spring Security 5 设置 DefaultAuthenticationEventPublisher
问题描述
我已经将我们的一些服务从 SS 4 版本更新到 Spring Security 5,它具有对 OAuth2 的外部支持。在大多数情况下,我已经能够更新我们的服务。
以前我们的 WebSecurityConfigurerAdapter 有以下配置函数,我们在 OAuth2AuthenticationProcessingFilter 上设置 applicationEventPublisher,以便我们可以输出有关 AuthenticationEvents 的日志消息。
但是 OAuth2AuthenticationProcessingFilter 在 SS5 中消失了,因为现在直接支持 OAuth2 支持。
他们是一种更简单的方法来设置 AuthenticationEventPublisher 而无需创建我自己的过滤器并重新创建检查身份验证的部分以让 Spring 再次完成它?
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
OAuth2AuthenticationProcessingFilter filter = new OAuth2AuthenticationProcessingFilter();
filter.setAuthenticationManager(authenticationManager);
filter.setStateless(true);
filter.setAuthenticationEventPublisher(
new DefaultAuthenticationEventPublisher(applicationEventPublisher));
filter.afterPropertiesSet();
http.csrf()
.disable()
.anonymous()
.disable()
.httpBasic()
.disable()
.logout()
.disable()
.formLogin()
.disable()
.addFilterBefore(filter, SessionManagementFilter.class)
.antMatcher("/actuator/**")
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS)
.permitAll()
.antMatchers("/actuator/**")
.access("#oauth2.hasScope('auditor')")
.anyRequest()
.authenticated()
.accessDecisionManager(accessDecisionManager);
}
@Bean
public ApplicationListener<AuditApplicationEvent> onEventListener() {
return (AuditApplicationEvent event) -> {
LoggingUtil loggingFormat = new LoggingUtil();
loggingFormat.setUser(event.getAuditEvent().getPrincipal());
loggingFormat.setEvent("Resource Authentication");
loggingFormat.setOutcome(event.getAuditEvent().getType());
loggingFormat.setMessage(
event.getAuditEvent().getData().containsKey("message")
? event.getAuditEvent().getData().get("message").toString()
: "");
String info = loggingFormat.toString();
logger.info(info);
};
}
对于我们的 SS 5,我们有
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
SessionManagementFilter as;
//TODO how do we setup the authenticationEventPublisher
//filter.setAuthenticationEventPublisher(
// new DefaultAuthenticationEventPublisher(applicationEventPublisher));
http.csrf()
.disable()
.anonymous()
.disable()
.httpBasic()
.disable()
.logout()
.disable()
.formLogin()
.disable()
// .addFilterBefore(filter, SessionManagementFilter.class)
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS)
.permitAll()
.antMatchers("/actuator/**").hasAuthority("SCOPE_auditor")
.anyRequest()
.authenticated()
.and()
.oauth2ResourceServer().jwt();
}
解决方案
推荐阅读
- rest - 使用 MessageBodyReader 时,面对来自 JAX-RS 客户端的 HTTP 415 Unsupported Media Type
- ssh - 查看 ssh 进入机器后运行的所有脚本
- swift - AudioKit AKMicrophone 不输出任何数据
- python - 从一列数据框创建新列和标题
- angular - ASP.NET Core 和 Angular 重定向 API 404 调用
- javascript - 为什么 Vuetify 数据表没有正确更新?
- android - 谷歌地图,添加新标记并删除旧标记android
- javascript - 如何使用 axios 在请求标头中发送 clientIP
- javascript - 如何在我的反应组件中呈现对象 HTMLDivElement?
- c# - 在 kafka-net 中调用 .Wait() 时任务无限挂起