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

Таким образом, вам нужно сделать три вещи, чтобы это заработало.

  1. Переименуйте действие в объявлении формы в jsp в action="
  2. Переименуйте поле имени пользователя в j_username
  3. Переименовать поле пароля в 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.

Другие вопросы по тегам