При запуске приложения с использованием Spring Security я получаю сообщение об ошибке ниже во всех браузерах:
"The server understood the request but refuses to authorize it"
Я попытался изменить роли с «ROLE_ADMIN» на «ROLE_USER» в файле «spring -security.xml».
Ниже находится "spring -security.xml"
<http auto-config = "true">
<intercept-url pattern = "/admin" access = "hasRole('ROLE-USER')"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name = "abc" password = "xyz" authorities = "hasRole('ROLE-USER')" />
</user-service>
</authentication-provider>
</authentication-manager>
Ниже приведен класс SpringController:
@Controller
public class SpringController {
@RequestMapping(value = "/")
public String homePage() {
return "HomePage";
}
@RequestMapping(value = "/admin", method=RequestMethod.GET)
public String loginPage() {
return "login";
}
Страницы HomePage.jsp и login.jsp загружаются, но после передачи учетных данных в login.jsp возникает ошибка:
HTTP Status 403 – Forbidden
Type: Status Report
Message: Access is denied
Description: The server understood the request but refuses to authorize it.
Apache Tomcat/7.0.90





403 - это очень общий код ошибки. Я столкнулся с той же проблемой, но после внесения некоторых изменений я смог заставить ее работать. По-прежнему не уверен, была ли проблема в шифровании пароля или настройке тега форма-логин.
<security:http auto-config = "true" >
<security:intercept-url pattern = "/login*" access = "isAnonymous()" />
<security:intercept-url pattern = "/**" access = "isAuthenticated()"/>
<security:form-login login-page = "/login" login-processing-url = "/login-user" authentication-failure-url = "/login?error=true" />
<security:csrf disabled = "true" />
<security:logout logout-success-url = "/" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name = "admin" password = "{noop}admin" authorities = "ROLE_USER" />
</security:user-service>
</security:authentication-provider >
</security:authentication-manager>
Игнорируйте префикс безопасность: в тегах.
{нет} перед паролем гарантирует, что я не использую шифрование пароля.
Контроллер для отображения JSP входа
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(value = { "/", "" }, method = { RequestMethod.GET})
public String login(HttpServletRequest request) {
System.out.println("LoginController.login() "+request.getRequestURI());
return "login";
}
}
Форма действия
<form name='loginForm' action = "login-user" method='POST'>
У меня возникла эта проблема, но не при использовании пружины. Мы размещали два экземпляра нашего собственного приложения на одном сервере, но использовали два разных порта. Вход в один экземпляр прошел нормально, однако вход в другой из того же браузера (другая вкладка) вызывал указанную выше ошибку из tomcat, которой предшествовало это сообщение «Ошибка проверки CSRF nonce».
Обходной путь, который я сделал, - это войти в другой экземпляр из другого браузера. Я знаю, что это не исправление, но это может помочь, если у вас есть ситуация, похожая на мою
Это происходит потому, что вы используете обычные теги <form> с безопасностью Spring, пока он проверяет CSRF-атаки.
Решение такое:
<form action = "..." method = "POST">
<input type = "hidden" name = "${_csrf.parameterName}" value = "${_csrf.token}" />
</form><%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form action = "..." method = "POST">
</form:form>Это также произошло со мной, когда я случайно запустил два экземпляра своего приложения на разных серверах tomcat. Я решил это, удалив рабочие каталоги приложения в моих папках webapps и work и перезапустив сервер.