Ist es möglich, Spring Security für eine Art HTTP-Methode zu deaktivieren?
Wir haben eine Spring REST-Anwendung mit Diensten, für die ein Autorisierungstoken im Header der http-Anforderung angehängt werden muss. Ich schreibe einen JS-Client dafür und verwende JQuery, um die GET / POST-Anforderungen zu senden. Die Anwendung ist mit diesem Filtercode CORS-fähig.
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());
}
Wenn JQuery jedoch die OPTIONS-Anforderung für CORS sendet, antwortet der Server mit dem Token Authorization Failed. Offensichtlich fehlt der OPTIONS-Anforderung das Autorisierungstoken. Ist es also möglich, die OPTIONEN aus der Spring-Sicherheitskonfiguration aus der Sicherheitsschicht zu entfernen?
quelle
<intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST, OPTIONS" />
. Richtig ?Wenn Sie eine auf Anmerkungen basierende Sicherheitskonfigurationsdatei (
@EnableWebSecurity
&@Configuration
) verwenden, können Sie in derconfigure()
Methode Folgendes ausführen, damit dieOPTION
Anforderungen von Spring Security ohne Authentifizierung für einen bestimmten Pfad zugelassen werden:@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(); }
quelle
Alle OPTIONEN im Kontext zulassen:
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); }
quelle
Für den Fall, dass jemand nach einer einfachen Lösung mit Spring Boot sucht. Fügen Sie einfach eine zusätzliche Bohne hinzu:
@Bean public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() { return configurer -> { List<RequestMatcher> matchers = new ArrayList<>(); matchers.add(new AntPathRequestMatcher("/**", "OPTIONS")); configurer.requestMatchers(new OrRequestMatcher(matchers)); }; }
Bitte beachten Sie, dass dies je nach Ihrer Anwendung für potenzielle Exploits geöffnet werden kann.
Offenes Problem für eine bessere Lösung: https://github.com/spring-projects/spring-security/issues/4448
quelle
IgnoredRequestCustomizer
ist seit Spring Boot 2 veraltet.Wenn Sie eine auf Anmerkungen basierende Sicherheitskonfiguration verwenden, sollten Sie
CorsFilter
dem Anwendungskontext Federn hinzufügen, indem Sie.cors()
Ihre Konfiguration aufrufen.@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/resources/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic() .and() .cors(); }
quelle
In einigen Fällen muss es hinzugefügt werden
configuration.setAllowedHeaders(Arrays.asList("Content-Type"));
,corsConfigurationSource()
wennWebSecurityConfigurerAdapter
das Cors-Problem gelöst werden soll.quelle