Вход в ajax с помощью Spring WebMVC и Spring Security - PullRequest
16 голосов
/ 10 августа 2010

Я использую Spring Security 3.0 для нашего механизма входа на сайт, используя специальную страницу входа. Теперь мне нужно, чтобы эта веб-страница входа в систему была лайтбоксом / всплывающим окном на каждой веб-странице нашего сайта, где при входе в систему я получаю результат AJAX независимо от того, был он успешным или нет. Как лучше всего это сделать с помощью Spring Security и Spring webmvc 3.0?

Ответы [ 2 ]

13 голосов
/ 10 августа 2010

На стороне клиента вы можете имитировать обычную отправку формы на ваш логин через ajax.Например, в jQuery:

$.ajax({
    url: "${pageContext.request.contextPath}/j_spring_security_check",
    type: "POST",
    data: $("#loginFormName").serialize(),
    beforeSend: function (xhr) {
        xhr.setRequestHeader("X-Ajax-call", "true");
    },
    success: function(result) {
        if (result == "ok") {
            ...
        } else if (result == "error") {
            ...
        }
    }
});

На стороне сервера вы можете настроить AuthenticationSuccessHandler и AuthenticationFailureHandler для возврата значения вместо перенаправления.Поскольку вам, вероятно, также нужна обычная страница входа (для попытки доступа к защищенной странице через прямой URL), вы должны сообщать ajax-вызовы из обычных вызовов, например, используя заголовок:

public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    private AuthenticationSuccessHandler defaultHandler;

    public AjaxAuthenticationSuccessHandler() {

    }
    public AjaxAuthenticationSuccessHandler(AuthenticationSuccessHandler defaultHandler) {
        this.defaultHandler = defaultHandler;
    }

    public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication auth)
        throws IOException, ServletException {
    if ("true".equals(request.getHeader("X-Ajax-call"))) {
        response.getWriter().print("ok");
        response.getWriter().flush();
    } else {
        defaultHandler.onAuthenticationSuccess(request, response, auth);
    }
}
}
7 голосов
/ 12 февраля 2011

Я сделал что-то похожее (спасибо axtavt):

public class AjaxAuthenticationSuccessHandler extends
    SimpleUrlAuthenticationSuccessHandler {

public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication auth)
        throws IOException, ServletException {
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
        response.getWriter().print(
                "{success:true, targetUrl : \'"
                        + this.getTargetUrlParameter() + "\'}");
        response.getWriter().flush();
    } else {
        super.onAuthenticationSuccess(request, response, auth);
    }
}}

Я решил расширить простой обработчик успеха для поведения по умолчанию для запросов без Ajax. Вот XML, чтобы заставить его работать:

<http auto-config="false" use-expressions="true" entry-point-ref="authenticationProcessingFilterEntryPoint">
    <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" />
...
...
</http>

<beans:bean id="authenticationProcessingFilterEntryPoint"
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/index.do" />
    <beans:property name="forceHttps" value="false" />
</beans:bean>

<beans:bean id="authenticationFilter" class=
    "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check"/>
    <beans:property name="sessionAuthenticationStrategy" ref="sas" />
    <beans:property name="authenticationFailureHandler" ref="failureHandler"/>
    <beans:property name="authenticationSuccessHandler" ref="successHandler"/>
</beans:bean>

<beans:bean id="successHandler" class="foo.AjaxAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/login.html"/>
</beans:bean>

<beans:bean id="failureHandler" class="foo.AjaxAuthenticationFailureHandler" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...