используйте Spring Security, чтобы сообщить ajax-запросам, где находится страница входа - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть какой-то URL-адрес, защищенный пружиной (настроенный через xml).Оно работает.Однако, когда я пытаюсь поразить эту конечную точку запросом ajax, я получаю 302 (найденный) ответ.Это перенаправляет мой вызов ajax на страницу входа в систему (поэтому я получаю HTML).Однако я хотел бы получить 401 (неавторизованный) ответ с URL-адресом страницы входа, доступной клиентскому приложению, чтобы я мог перенаправить туда пользователя с помощью javascript. Этот вопрос кажется наиболее близким к тому, что я хочу, но нет примера, и он предлагает изменить контроллер снова.Нет ли в Spring-Security никакой конфигурации, которая выдаст мне 401 и URL (или какое-нибудь другое разумное сообщение об ошибке и URL страницы входа в систему)?

Ответы [ 2 ]

16 голосов
/ 08 декабря 2011

Вы можете расширить LoginUrlAuthenticationEntryPoint.Вот мой:

package hu.progos.springutils;
// imports omitted
public class AjaxAwareLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
    public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException, ServletException {
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        } else {
            super.commence(request, response, authException);
        }
    }
}

Затем настройте Spring для использования вашей реализации:

<beans:bean id="authEntryPoint" class="hu.progos.springutils.AjaxAwareLoginUrlAuthenticationEntryPoint" scope="singleton>
    <beans:property name="loginFormUrl" value="/login.html" />
</beans:bean>

<http entry-point-ref="authEntryPoint">
  <!-- your settings here -->
</http>
0 голосов
/ 18 ноября 2011

Конечно, есть миллион способов сделать это.Но кратким решением вашей проблемы является следующий фрагмент конфигурации:

<bean id="customAuthEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
   <property name="loginFormUrl" value="/your-custom-login" />
</bean>

Я также сделал еще один шаг и отключил автоконфигурацию безопасности, чтобы сопоставить вышеуказанную точку входа следующим образом:

 <security:http auto-config="false" entry-point-ref="customAuthEntryPoint">
   ...
   ...
 </security:http>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...