특정 URL에 대해 Spring Security 3.2 CSRF 사용 안 함
Spring security 3.2를 사용하여 Spring MVC 응용 프로그램에서 CSRF를 활성화했습니다.
my spring-security.xml
<http>
<intercept-url pattern="/**/verify" requires-channel="https"/>
<intercept-url pattern="/**/login*" requires-channel="http"/>
...
...
<csrf />
</http>
요청 URL에 '확인'이 포함된 요청에 대해 CSRF를 비활성화하려고 합니다.
My SecurityConfig.java
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
private CsrfMatcher csrfRequestMatcher = new CsrfMatcher();
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().requireCsrfProtectionMatcher(csrfRequestMatcher);
}
class CsrfMatcher implements RequestMatcher {
@Override
public boolean matches(HttpServletRequest request) {
if (request.getRequestURL().indexOf("verify") != -1)
return false;
else if (request.getRequestURL().indexOf("homePage") != -1)
return false;
return true;
}
}
}
crf filter는 'verify'에서 제출한 CSRF 토큰을 검증하고, Invalid token exception(403)은 내가 http에서 http로 요청을 제출할 때 던집니다.이러한 시나리오에서 crf 토큰 인증을 비활성화하려면 어떻게 해야 합니까?
이것이 직접적인 대답이 아니라는 것을 알지만, 사람들은 보통 이런 종류의 질문을 검색할 때 스프링 버전을 지정하지 않습니다.따라서 스프링 시큐리티(spring security) 때문에 일부 경로를 무시할 수 있는 방법이 존재합니다.
다음은 CSRF 보호가 무시되도록 보장합니다.
- GET, HEAD, TRACE, Options (기본값)
- 또한 "/sockjs/"로 시작하는 요청은 무시한다고 명시적으로 말합니다.
http.csrf().AntMatchers 무시("/sockjs/**").그리고...
제 대답이 다른 사람에게 도움이 되었으면 좋겠습니다.Spring Boot에서 특정 URL에 대해 CSFR을 비활성화하는 방법을 검색하는 이 질문을 찾았습니다.
여기에 설명된 솔루션 http://blog.netgloo.com/2014/09/28/spring-boot-enable-the-csrf-check-selectively-only-for-some-requests/ 을 사용했습니다.
일부 URL에서 CSFR 컨트롤을 사용하지 않도록 설정할 수 있는 Spring Security 구성입니다.
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// Build the request matcher for CSFR protection
RequestMatcher csrfRequestMatcher = new RequestMatcher() {
// Disable CSFR protection on the following urls:
private AntPathRequestMatcher[] requestMatchers = {
new AntPathRequestMatcher("/login"),
new AntPathRequestMatcher("/logout"),
new AntPathRequestMatcher("/verify/**")
};
@Override
public boolean matches(HttpServletRequest request) {
// If the request match one url the CSFR protection will be disabled
for (AntPathRequestMatcher rm : requestMatchers) {
if (rm.matches(request)) { return false; }
}
return true;
} // method matches
}; // new RequestMatcher
// Set security configurations
http
// Disable the csrf protection on some request matches
.csrf()
.requireCsrfProtectionMatcher(csrfRequestMatcher)
.and()
// Other configurations for the http object
// ...
return;
} // method configure
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
// Authentication manager configuration
// ...
}
}
Spring Boot 1.2.2(및 Spring Security 3.2.6)와 함께 작동합니다.
Spring Security v4.1을 사용하고 있습니다.많은 읽기와 테스트를 거친 후 XML 구성을 사용하여 특정 URL에 대한 CSRF 보안 기능을 비활성화합니다.
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<http pattern="/files/**" security="none" create-session="stateless"/>
<http>
<intercept-url pattern="/admin/**" access="hasAuthority('GenericUser')" />
<intercept-url pattern="/**" access="permitAll" />
<form-login
login-page="/login"
login-processing-url="/login"
authentication-failure-url="/login"
default-target-url="/admin/"
password-parameter="password"
username-parameter="username"
/>
<logout delete-cookies="JSESSIONID" logout-success-url="/login" logout-url="/admin/logout" />
<http-basic />
<csrf request-matcher-ref="csrfMatcher"/>
</http>
<beans:bean id="csrfMatcher" class="org.springframework.security.web.util.matcher.OrRequestMatcher">
<beans:constructor-arg>
<util:list value-type="org.springframework.security.web.util.matcher.RequestMatcher">
<beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
<beans:constructor-arg name="pattern" value="/rest/**"/>
<beans:constructor-arg name="httpMethod" value="POST"/>
</beans:bean>
<beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
<beans:constructor-arg name="pattern" value="/rest/**"/>
<beans:constructor-arg name="httpMethod" value="PUT"/>
</beans:bean>
<beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
<beans:constructor-arg name="pattern" value="/rest/**"/>
<beans:constructor-arg name="httpMethod" value="DELETE"/>
</beans:bean>
</util:list>
</beans:constructor-arg>
</beans:bean>
//...
</beans:bean>
위 구성으로 시작하는 모든 URL의 POST|PUT|DEELETE 요청에 대해서만 CSRF 보안을 활성화합니다./rest/
.
특정 URL 패턴에 대해 명시적으로 비활성화하고 일부 URL 패턴에 대해 활성화합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order
public static class GeneralWebSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/rest/**").and()
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/home/**","/search/**","/geo/**").authenticated().and().csrf()
.and().formLogin().loginPage("/login")
.usernameParameter("username").passwordParameter("password")
.and().exceptionHandling().accessDeniedPage("/error")
.and().sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);
}
}
}
<http ...>
<csrf request-matcher-ref="csrfMatcher"/>
<headers>
<frame-options policy="SAMEORIGIN"/>
</headers>
...
</http>
<b:bean id="csrfMatcher"
class="AndRequestMatcher">
<b:constructor-arg value="#{T(org.springframework.security.web.csrf.CsrfFilter).DEFAULT_CSRF_MATCHER}"/>
<b:constructor-arg>
<b:bean class="org.springframework.security.web.util.matcher.NegatedRequestMatcher">
<b:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
<b:constructor-arg value="/chat/**"/>
</b:bean>
</b:bean>
</b:constructor-arg>
</b:bean>
을 비열한.
http
.csrf()
// ignore our stomp endpoints since they are protected using Stomp headers
.ignoringAntMatchers("/chat/**")
예제: https://docs.spring.io/spring-security/site/docs/4.1.x/reference/htmlsingle/
security=" none"을(를) 사용합니다.예를 들어 spring-security-config.xml에서
<security:intercept-url pattern="/*/verify" security="none" />
언급URL : https://stackoverflow.com/questions/22524470/spring-security-3-2-csrf-disable-for-specific-urls
'programing' 카테고리의 다른 글
크롬 확장 메시지 전달: 응답이 전송되지 않음 (0) | 2023.11.07 |
---|---|
브라우저 뒤로가기 버튼을 사용할 때 페이지를 강제로 다시 로드하는 방법은? (0) | 2023.11.07 |
MariaDB Analyze FORMAT=JSON 출력에서 전체 시간을 계산할 수 없습니다. (0) | 2023.11.07 |
1비트 길이의 데이터 타입을 C로 생성할 수 있습니까? (0) | 2023.11.07 |
각도 2에서 colspan이 알려진 네이티브 속성이 아닌 이유는 무엇입니까? (0) | 2023.11.07 |