为了保护/ login spring安全性,必须禁用CSRF

问题描述 投票:0回答:2

我的所有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 csrf
2个回答
0
投票

如果您不使用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> 

0
投票

尝试一下:

更改Spring-Security.xml:

<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>

CsrfSecurityRequestMatcher

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.