发布后,Spring Security Access被拒绝403

时间:2015-06-24 13:25:34

标签: java spring spring-mvc spring-security csrf

我在其他帖子中几乎尝试了所有关于它的事情,没有任何与我的问题有关。

如果我尝试通过GET恢复我的URL(例如:路径/用户/编辑/ 1),一切正常,我会被重定向到用户编辑页面,但是如果我尝试通过POST访问此页面,则弹簧安全性拒绝我访问该页面。

这两个方法都映射到我的控制器类中。

@RequestMapping(value="/users/edit/{id}", method={RequestMethod.POST,RequestMethod.GET})
public ModelAndView login(ModelAndView model, @PathVariable("id") int id ) {
    model.addObject("user", this.userService.getUserById(id));
    model.setViewName("/users/add"); //add.jsp
    return model;
}

我使用帖子的表格

<f:form method="post" action="/users/edit/${user.id}">
     <button type="submit">Edit</button>
</f:form>

Spring security.xml

<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/secure**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />
    <intercept-url pattern="/secure/users**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />

    <!-- access denied page -->
    <access-denied-handler error-page="/denied" />
    <form-login 
        login-page="/home" 
        default-target-url="/secure" 
        authentication-failure-url="/home?error" 
        username-parameter="inputEmail"
        password-parameter="inputPassword" />
    <logout logout-success-url="/home?logout"  />
    <!-- enable csrf protection -->
    <csrf/>
</http>

<!-- Select users and user_roles from database -->
<authentication-manager>
    <authentication-provider>
        <password-encoder hash="md5" /> 
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query=
            "SELECT login, senha, ativo
               FROM usuarios 
              WHERE login = ?"
            authorities-by-username-query=
            "SELECT u.login, r.role
               FROM usuarios_roles r, usuarios u
              WHERE u.id = r.usuario_id
                AND u.login = ?" />
    </authentication-provider>
</authentication-manager>

3 个答案:

答案 0 :(得分:18)

我注意到您正在使用csrf保护,默认情况下会保护修改资源的任何HTTP动词(例如PUT,POST,DELETE,...)。如果您使用的是Spring的表单标记,则应自动将csrf标记作为隐藏输入包含在表单中。您应该在浏览器中检查源代码以验证csrf令牌是否存在,否则您将需要以下内容:

<input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/> 

您可以在Spring参考中阅读有关csrf protection/configuration的更多信息。

答案 1 :(得分:0)

您可以简单地使用<sec:csrfInput/>标签,如下所示:

    <f:form method="post" action="/users/edit/${user.id}">
        <button type="submit">Edit</button>
        <sec:csrfInput/>
    </f:form>

请确保导入spring安全标签

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>

答案 2 :(得分:0)

我知道这是一篇过时的文章,但是我想发表,以防任何人像我一样在搜索时遇到此问题。

确保在扩展WebSecurityConfigurerAdapter

的类上具有正确的注释

@Configuration

@EnableWebSecurity

我错过了这些,花了几个小时来解决一个不存在的问题。