2015-04-30 2 views
0

Мне нужен чистый URL, а не добавленный добавочный номер. Я использую структуру Backbone.js в своем интерфейсе. У меня есть построенный вид, который собирает имя пользователя и пароль и выполняет спокойный запрос /j_spring_security_check.Spring Security/j_spring_security_check без JSP

По какой-то причине имя пользователя и пароль не отображаются конечной точкой /j_spring_security_check.

Вот запрос я выступаю в позвоночнике:

loginModel.save(loginModel.toJSON(), { 
    success: _.bind(function(response) { 
     Backbone.history.navigate('', {trigger: true}); 
    }, this), 
    error: function() { 
     console.log('test'); 
    } 
}); 

Я попытался сделать запрос с j_username и j_password как атрибуты модели как таковой и установка URL в /j_spring_security_check.

Я также попытался прохождения Params непосредственно в URL, как например:

/jspring_security_check?j_username=X&j_password=Z 

Оба способа попасть в мои поставщик AUTH аутентификации метод, но Полномочия и Principal являются пустыми строками, так auth не работает.

Когда я делаю мои запросы, я могу видеть в инструментах разработчика браузера, запрашивающих полезной нагрузки получает setnt вниз:

{j_username: "a", j_password: "a"} j_password: "a" j_username: "a" 

Что такое правильный способ сделать запрос /j_spring_security_check без использования формы JSP?

ответ

1

Давайте посмотрим на класс Spring, который выполняет проверку подлинности, которая /org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java

private boolean postOnly = true; 

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { 
    if (postOnly && !request.getMethod().equals("POST")) { 
     throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); 
    } 

Вы отправляете запрос GET с/jspring_security_check? J_username = X & j_password = Z, когда он ожидает запрос POST.

Запрос должен быть POST-запросом с приложением Content-Type 'application/x-www-form-urlencoded' и двумя параметрами. Тело запроса не должно быть объектом JSON.

Предлагаю пересмотреть ваш логин и не использовать Ajax.

j_spring_security_check не предназначен для вызова через Ajax со страницы входа. Он предназначен для приема запроса POST из HTML-формы, а затем для отображения главной страницы приложения в ответе HTTP для отправки формы входа в систему.

Что делает j_spring_security_check, так это то, что он аутентифицирует пользователя, и если аутентификация прошла успешно, он создает сеанс и перенаправляет пользователя на главный экран, иначе он перенаправляет пользователя на экран «с ошибкой входа». j_spring_security_check возвращает 302 HTTP-код, который перенаправляется.

Вход в систему RESTful возможен, но вам нужно настроить j_spring_security_check для ответа не на успешное (или неудачное) окно входа в систему, а с помощью JSON, поэтому вам придется писать пользовательские обработчики входа на стороне Java. Я сделал это один раз, и это сделало код (как Java, так и ExtJS) настолько сложным, что я вернулся к регистрации на основе форм. В конце концов, Facebook и Google используют форму для входа в систему, и это довольно нормально. В моем случае переход на логин AJAX REST не стоил усилий.

Еще одно преимущество подачи формы заключается в том, что веб-браузер может запоминать логин и пароль, что невозможно с помощью входа в систему на основе Ajax, и я думаю, что именно поэтому Google и Facebook используют форму представления.

Но если вы решили, что вам по-прежнему нужен вход на основе Ajax (который я решительно отвергаю из-за сложности реализации и потому, что пользовательский интерфейс не повредит менеджер паролей браузера, который не работает), вам придется создать два Spring MVC-контроллера , один для успешного входа в систему (loginSucessController), другой для входа в систему (loginFailureController), оба контроллера должны возвращать единообразный ответ JSON с статусом входа. Затем настроить Spring Security для использования двух контроллеров выше

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     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.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
<sec:http> 
      <sec:intercept-url pattern="/**"/> 
      <sec:http-basic/> 
      <sec:form-login default-target-url="/loginSucessController" authentication-failure-url="/loginFailureController"/> 
      <sec:logout/> 
    </sec:http> 
</beans> 

Конечно, вам придется создавать отображения и реализацию для loginSucessController и loginFailureController, я пропустил эту часть.

loginSucessController должен вернуть

{ "loginStatus": 1 } 

и loginFailureController должен возвращать

{ "loginStatus": 0 } 

Вы также должны создать третий контроллер MVC, чтобы обнаружить, если пользователь уже подписан в решить, если форму входа должен отображаться, когда пользователь возвращается на веб-страницу приложения, используйте org.springframework.security.core.context.SecurityContextHolder # getContext

+0

проблема, которую я использую при использовании JSP, - это мои ходовые представления, все используют HTML-шаблоны для создания html-представлений. Поэтому, чтобы использовать JSP-страницу, мне пришлось бы строить эту одну страницу без основы. Я бы предпочел просто создать все приложение, используя базовую структуру. – nmb1106

+0

Каков наилучший способ использования формы входа в JSP, когда я использую магистраль? Можно ли встроить jsp в представление о магистрали? – nmb1106

+0

Когда я разрабатывал приложение с ExtJS, я создал отдельную статическую HTML-страницу для входа в систему, которая вообще не использовала javascript. Пользователь был перенаправлен в файл приложения ExtJS application html при успешном входе в систему, это самый простой подход. –