错误HTTP状态403 - 无效的CSRF令牌' null'在请求参数' _csrf'上找到或标题' X-CSRF-TOKEN'

时间:2016-04-22 06:44:55

标签: java spring spring-mvc spring-security

您好我是Spring安全新手,我使用的是here提到的示例  通过Mkyong,我使用的是本教程中提供的基于注释的示例,但每当我在登录表单中输入值并单击下面的提交按钮时,它总是会出现异常。

type Status report

message Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

description Access to the specified resource has been forbidden.

我试过google但没找到任何合适的答案,解决了这个问题。安全配置类在下面。

SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationProvider")
    AuthenticationProvider authenticationProvider;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/admin/**")
            .access("hasRole('ROLE_USER')").and().formLogin()
            .loginPage("/login").failureUrl("/login?error")
                .usernameParameter("username")
                .passwordParameter("password")
                .and().logout().logoutSuccessUrl("/login?logout").and().csrf();
    }

}

login.jsp表单位于

之下
<form name='loginForm'
            action="<c:url value='/login'/>" method='POST' enctype="multipart/form-data">

            <table>
                <tr>
                    <td>User:</td>
                    <td><input type='text' name='username'></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><input type='password' name='password' /></td>
                </tr>       
                <tr>                
                    <td colspan='2'><input name="submit" type="submit"
                        value="submit" /></td>
                </tr>
            </table>
<input type="hidden" name="${_csrf.parameterName}"
            value="${_csrf.token}" />
        </form>

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:4)

请将以下代码添加到您的安全配置中,看看它是否有任何差异

declare @parent table
(
    [SEARCHID] [int] NOT NULL,
    [COMPID] [int] NOT NULL,
    [COMPPNO] [varchar](35) NOT NULL,
    [PACKSIZE] [varchar](100) NOT NULL
)

DECLARE @CHILD TABLE
(
    [SEARCHID] [int] NOT NULL,
    [COMP_ID] [int] NULL,
    [PROD_LINK] [varchar](500) NULL,
    [SRPNO] [varchar](24) NULL
)

答案 1 :(得分:1)

问题在于多部分表单类型,您只需要使用此

<form name='loginForm'
            action="<c:url value='/login'/>" method='POST'>
而不是你原来的

<form name='loginForm'
            action="<c:url value='/login'/>" method='POST' enctype="multipart/form-data">

如果您需要将表单类型用作多部分表单,而不是将MultipartFilter添加到web.xml,以确保在Spring Security配置之前添加它:

<filter>
    <display-name>springMultipartFilter</display-name>
    <filter-name>springMultipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>springMultipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>