【问题标题】:CrossOrigin annotation doesn't work with spring securityCrossOrigin 注释不适用于 Spring Security
【发布时间】:2016-01-28 08:31:59
【问题描述】:

当我启用 spring-boot-starter-security 依赖项时。 CORS 支持不起作用。

这是我的 SecurityConfiguration 类:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected AuthenticationManager authenticationManager() throws Exception {

        return authentication -> {

          // ...
        };
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {

        http.csrf()

            // Disabling CSRF
            .disable()

            // Disabling Session Management
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.NEVER)
            .and()

            // Adding custom REST Authentication filter
            .addFilterBefore(new RestAuthenticationFilter(authenticationManager()), LogoutFilter.class)

            // Authorizing requests
            .authorizeRequests()
            .antMatchers("/", "/frontend/login")
            .permitAll()
            .antMatchers("/api/**", "/frontend/**")
            .authenticated()
            .antMatchers("/**")
            .permitAll();
    }
}

我的控制器类有一个 CrossOrigin 注解:

@CrossOrigin
@RequestMapping("/frontend")
@RestController
public class FrontEndController extends BaseController {

我可以使用自定义 CORS 过滤器处理 CORS,但我只想使用一个 Annoation。

【问题讨论】:

    标签: java spring spring-security spring-boot


    【解决方案1】:

    我找到了 2 种方法来为启用了 spring-security 的 spring-boot 项目添加 CORS 支持。我们可以将 spring-web CorsFilter 添加到安全过滤器链中。以下示例属于基于令牌的身份验证项目。所以我们使用了自定义的 RestAuthenticationFilter。

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(final HttpSecurity http) throws Exception {
    
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration               config = new CorsConfiguration();
    
            config.addAllowedOrigin("*");
            config.addAllowedHeader("*");
            config.addAllowedMethod("GET");
            config.addAllowedMethod("PUT");
            config.addAllowedMethod("POST");
            source.registerCorsConfiguration("/**", config);
    
            http.csrf()
    
                // Disabling CSRF
                .disable()
    
                // Disabling Session Management
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.NEVER)
                .and()
    
                // Adding spring-web CORS filter
                .addFilterBefore(new CorsFilter(source), LogoutFilter.class)
    
                // Adding custom REST Authentication filter
                .addFilterBefore(new RestAuthenticationFilter(authenticationManager()), LogoutFilter.class)
    
                // Authorizing requests
                .authorizeRequests()
                .antMatchers("/", "/frontend/login")
                .permitAll()
                .antMatchers("/api/**", "/frontend/**")
                .authenticated()
                .antMatchers("/**")
                .permitAll();
        }
    }
    

    但是在上面的例子中,我们在控制器中的 CrossOrigin 注释是多余的。所以我们应该给spring-web层控制CORS请求的能力。因此我们可以允许 CORS pre-flight(OPTIONS HTTP 方法)。

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
    
        @Override
        protected void configure(final HttpSecurity http) throws Exception {
    
            http.csrf()
    
                // Disabling CSRF
                .disable()
    
                // Disabling Session Management
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.NEVER)
                .and()
    
                // Adding custom REST Authentication filter
                .addFilterBefore(new RestAuthenticationFilter(authenticationManager()), LogoutFilter.class)
    
                // Authorizing requests
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**")
                .permitAll()
                .antMatchers("/", "/frontend/login")
                .permitAll()
                .antMatchers("/api/**", "/frontend/**")
                .authenticated()
                .antMatchers("/**")
                .permitAll();
        }
    }
    

    借助上述配置,我们可以同时使用@CrossOrigin 注解和spring-security 配置。

    【讨论】:

      猜你喜欢
      • 2019-09-18
      • 2017-10-19
      • 1970-01-01
      • 2020-10-09
      • 2021-09-17
      • 2018-03-16
      • 2021-11-15
      • 2014-08-31
      • 2016-05-01
      相关资源
      最近更新 更多