HTTP Status 405 - Метод запроса "POST" не поддерживается при попытке отправить пользовательскую форму входа Spring Security
Я использую весну, весеннюю безопасность. У моего приложения есть пользовательская страница входа на страницу jsp, где я пытаюсь опубликовать имя пользователя, пароль и токен csrf, а в бэкэнде у меня есть контроллер для сбора и аутентификации данных входа в систему. Я использую кота. Я использую Spring Security для аутентификации при входе. Получение следующей ошибки при отправке формы для входа в файл HTTP Status 405 - Метод запроса "POST" не поддерживается Есть идеи?
Страница авторизации:
<div id="login-box">
<h3>Login with Username and Password</h3>
<c:if test="${not empty error}">
<div class="error">${error}</div>
</c:if>
<c:if test="${not empty msg}">
<div class="msg">${msg}</div>
</c:if>
<form name='loginForm' action="<c:url value='/login' />" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''></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>
</div>
Класс контроллера:
@Controller
public class HelloController {
@RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
public ModelAndView welcomePage() {
ModelAndView model = new ModelAndView();
model.addObject("title", "Spring Security Custom Login Form");
model.addObject("message", "This is welcome page!");
model.setViewName("hello");
return model;
}
@RequestMapping(value = "/admin**", method = RequestMethod.GET)
public ModelAndView adminPage() {
ModelAndView model = new ModelAndView();
model.addObject("title", "Spring Security Custom Login Form");
model.addObject("message", "This is protected page!");
model.setViewName("admin");
return model;
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login(@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "Invalid username and password!");
}
if (logout != null) {
model.addObject("msg", "You've been logged out successfully.");
}
model.setViewName("login");
return model;
}
Spring-Security Config:
<http auto-config="true">
<intercept-url pattern="/admin**" access="ROLE_USER" />
<form-login
login-page="/login"
default-target-url="/welcome"
authentication-failure-url="/login?error"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="mkyong" password="123456" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
3 ответа
Хорошо, проблема, которую я вижу здесь, находится в форме JSP. Действие формы неверно, Spring Security пытается выполнить обработку входа с другим действием по умолчанию. т.е. / j_spring_security_check и даже имена полей не верны в вашей почте.
Username field : j_username
Password field : j_password
Таким образом, вам нужно сделать три вещи, чтобы это заработало.
- Переименуйте действие в объявлении формы в jsp в action="
- Переименуйте поле имени пользователя в j_username
- Переименовать поле пароля в j_password
Spring Security действительно предоставляет гибкие возможности для переименования всех, но позволяет сначала получить базовую. Других изменений не ожидается
РЕДАКТИРОВАТЬ:
Я пропустил чтение имени пользователя и пароля.
Просто сделайте одну вещь (добавили свойство login-processing-url):
<http auto-config="true">
<intercept-url pattern="/admin**" access="ROLE_USER" />
<form-login
login-page="/login"
default-target-url="/welcome"
authentication-failure-url="/login?error"
login-processing-url="/login"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf/>
Прежде всего, вы перенаправляете на страницу входа с
model.setViewName("login");
Вы используете весеннюю безопасность? Если да, я не вижу в вашем коде ничего, касающегося фильтра безопасности Spring.
Я предлагаю вам взглянуть туда
или, очевидно, к весенней ссылке
Ваш контроллер принимает только запрос GET, ваша форма использует POST. Прежде всего я постараюсь изменить эту конфигурацию.
@RequestMapping(value = "/login", method = RequestMethod.POST)
Вы также можете избежать указания метода option, который должен означать GET и POST.