首页 > 解决方案 > 在 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();
    }

标签: springspring-security

解决方案


推荐阅读