gpt4 book ai didi

java - 发布后 Spring Security Access 被拒绝 403

转载 作者:IT老高 更新时间:2023-10-28 13:45:53 24 4
gpt4 key购买 nike

我已经尝试了其他帖子中关于它的几乎所有内容,与我的问题无关。

如果我尝试通过 GET 恢复我的 URL(例如: path/users/edit/1 )一切正常,我会被重定向到用户编辑页面,但如果我尝试通过 POST 访问此页面,spring security拒绝我访问该页面。

这两个方法都映射到我的 Controller 类中。

@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;
}

我使用 post 的表单

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

Spring 安全性.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>

最佳答案

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

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

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

关于java - 发布后 Spring Security Access 被拒绝 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31027882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com