我的所有REST接口在启用csrf保护的情况下都可以正常工作,但是我需要为/ login禁用csrf,否则会收到403 Forbidden。我使用的是Spring Security,通过Spring Security可以使用登录路径。
http.csrf().disable()
How to disable csrf protection for particular pages in my website?
或者如果在登录页面上禁用CSRF没问题,该问题也将得到解决
编辑:
.csrf().ignoringAntMatchers("/login")
登录路径始终需要登录主体,因此应该没有CSRF攻击的可能性,不是吗?
如果您不使用spring mvc表单标签,则无法自动使用spring security csrf支持,可能您使用的是纯HTML表单标签,这就是为什么您获得http 403的原因,您需要在表单提交中手动添加csrf令牌。
要么您都需要使用像这样的spring mvc表单标签
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
…
<form:form action="" method="POST">
…
</form:form>
或手动在纯HTML表单提交中添加csrf令牌。
<form action="" method="POST">
<input type="hidden" name="${_csrf.parameterName}" value = "${_csrf.token}" />
…
</form>
<security:http use-expressions="true" authentication-manager-ref="authenticationManager">
<security:intercept-url pattern="/auth/**" access="hasAnyRole('ROLE_USER')" />
<security:form-login login-page="/login" authentication-success-handler-ref="loginSuccessHandler" authentication-failure-url="/login" login-processing-url="/j_spring_security_check" />
<security:logout invalidate-session="true" logout-url="/logout" success-handler-ref="logoutSuccessHandler" />
<security:csrf request-matcher-ref="csrfSecurityRequestMatcher" />
</security:http>
public class CsrfSecurityRequestMatcher implements RequestMatcher {
private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
private RegexRequestMatcher unprotectedMatcher = new RegexRequestMatcher("/ext/**", null);
@Override
public boolean matches(HttpServletRequest request) {
if(allowedMethods.matcher(request.getMethod()).matches()){
return false;
}
return !unprotectedMatcher.matches(request);
}
}