Spring Доступ к безопасности запрещен 403 после публикации
Я пробовал почти все в других сообщениях об этом, ничто не связано с моей проблемой.
Если я попытаюсь восстановить свой URL через GET (ex: путь /users/edit/ 1), все будет хорошо, и я перенаправляюсь на страницу редактирования пользователя, но если я попытаюсь получить доступ к этой странице через POST, spring безопасность запрещает мой доступ к странице.
Оба метода отображаются в моем классе контроллера.
@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 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>
Ответы
Ответ 1
Я заметил, что вы используете защиту csrf, которая по умолчанию защищает любой HTTP-глагол, который изменяет ресурс (например, PUT, POST, DELETE,...). Если вы используете тег формы Spring, токен csrf должен автоматически включаться как скрытый ввод в вашу форму. Вы должны проверить источник в своем браузере, чтобы проверить токен csrf, иначе вам понадобится что-то вроде этого:
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
Подробнее о защите/конфигурации csrf можно прочитать в Spring.
Ответ 2
Вы можете просто использовать <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" %>
Ответ 3
Я знаю, что это старая запись, но я хочу опубликовать ее на тот случай, если кто-то столкнется с этим во время поиска, как я.
Убедитесь, что у вас есть правильные аннотации для класса, который расширяет WebSecurityConfigurerAdapter
@Configuration
@EnableWebSecurity
Я пропустил это и провел несколько часов, работая над проблемой, которой не было.