为OPTIONS Http方法禁用Spring Security

是否有可能禁用一种HTTP方法的Spring安全?

我们有一个Spring REST应用程序,其服务需要授权令牌附加在http请求的头部。 我正在写一个JS客户端,并使用JQuery来发送GET / POST请求。 该应用程序是使用此filter代码启用CORS的。

doFilter(....) { HttpServletResponse httpResp = (HttpServletResponse) response; httpResp.setHeader("Access-Control-Allow-Origin", "*"); httpResp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); httpResp.setHeader("Access-Control-Max-Age", "3600"); Enumeration<String> headersEnum = ((HttpServletRequest) request).getHeaders("Access-Control-Request-Headers"); StringBuilder headers = new StringBuilder(); String delim = ""; while (headersEnum.hasMoreElements()) { headers.append(delim).append(headersEnum.nextElement()); delim = ", "; } httpResp.setHeader("Access-Control-Allow-Headers", headers.toString()); } 

但是,当JQuery发送CORS的OPTIONS请求时,服务器响应授权失败令牌。 显然,OPTIONS请求缺less授权令牌。 那么是否有可能让OPTIONS从Spring安全configuration转义到安全层呢?

你有没有尝试过

您可以使用多个元素为不同的url集定义不同的访问权限要求,但会按列出的顺序对其进行评估,并使用第一个匹配项。 所以你必须把最具体的比赛放在最上面。 你也可以添加一个方法属性来限制匹配到一个特定的HTTP方法(GET,POST,PUT等)。

 <http auto-config="true"> <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" /> <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" /> </http> 

上面的意思是你需要selectURL模式来截取你想要的方法

如果您使用基于注释的安全configuration文件(@EnableWebSecurity&@Configuration),则可以在configure()方法中执行类似下面的操作,以允许SpringSecurity允​​许OPTION请求,而无需对给定path进行身份validation:

 @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers(HttpMethod.OPTIONS,"/path/to/allow").permitAll()//allow CORS option calls .antMatchers("/resources/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); } 

在上下文中允许所有选项:

  @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); } 

如果有人正在寻找使用Spring Boot的简单解决scheme。 只需添加一个额外的bean:

  @Bean public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() { return configurer -> { List<RequestMatcher> matchers = new ArrayList<>(); matchers.add(new AntPathRequestMatcher("/**", "OPTIONS")); configurer.requestMatchers(new OrRequestMatcher(matchers)); }; } 

请注意,根据您的应用程序,这可能会打开它的潜在利用。

打开问题以获得更好的解决scheme: https : //github.com/spring-projects/spring-security/issues/4448