Я новичок в Spring Security и Spring MVC с jQuery. Моя Spring Security - довольно простая настройка, основанная на справочных документах Spring Security. Я использую Spring 3.2.4.Безопасность Ajax с использованием SpringMVC и jQuery
<http use-expressions="true">
<intercept-url pattern="/secure/login" access="permitAll" />
<intercept-url pattern="/secure/logout" access="permitAll" />
<intercept-url pattern="/secure/denied" access="permitAll" />
<session-management session-fixation-protection="migrateSession" session-authentication-error-url="/login.jsp?authFailed=true">
<concurrency-control max-sessions="10" error-if-maximum-exceeded="true" expired-url="/login.html" session-registry-alias="sessionRegistry"/>
</session-management>
<intercept-url pattern="/**" access="isAuthenticated()" />
<!-- <intercept-url pattern="/**" access="denyAll" /> -->
<form-login login-page="/secure/login" default-target-url="/" authentication-failure-url="/secure/denied" />
<logout logout-url="/secure/logout" logout-success-url="/" />
<expression-handler ref="defaultWebSecurityExpressionHandler" />
</http>
<authentication-manager>
<authentication-provider user-service-ref="com.ia.security.SpringSecurityDao" />
</authentication-manager>
<beans:bean id="com.ia.security.SpringSecurityDao" class="com.ia.security.SpringSecurityDaoImpl">
<beans:property name="usersByUsernameQuery">
<beans:value>select username,password,enabled
from user
where username = ?
</beans:value>
</beans:property>
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="enableGroups" value="true" />
<beans:property name="enableAuthorities" value="false" />
<beans:property name="groupAuthoritiesByUsernameQuery">
<beans:value>SELECT R.ID, R.NAME, P.NAME
FROM ROLE R
JOIN USER_ROLE UR on R.id = UR.role_id
JOIN USER U on U.id = UR.user_id
JOIN ROLE_PERMISSION RP ON RP.role_id = R.id
JOIN PERMISSION P ON P.id = RP.permission_id
WHERE U.username=?
</beans:value>
</beans:property>
</beans:bean>
При нормальных обстоятельствах все работает должным образом. Я могу запросить мою страницу через jQuery.ajax, и мой обратный вызов работает так, как ожидалось. Тем не менее, я не знаю, как настроить все, чтобы обрабатывать сеансовый тайм-аут или ответы на несанкционированный доступ.
Например, если сеанс заканчивается, и я продолжаю делать запрос Ajax, Spring Security перенаправляет вызов на страницу входа в систему. Таким образом, ответ на запрос ajax становится страницей входа в систему. На стороне клиента мне нужно знать, что пользователь больше не имеет доступа к запрашиваемой странице и предпринимает соответствующие действия - то есть: перенаправляет браузер на страницу входа/ошибки. То же самое верно, если у пользователя нет прав доступа к URL-адресу.
Я нашел похожие сообщения, которые касаются того, как настроить логины через ajax, но у меня возникли проблемы с пониманием того, как обращаться с несанкционированными запросами через ajax. Я предполагаю, что в случае вызовов Ajax сервер должен вернуть конкретный код состояния (например: 401 неавторизованный и т. Д.), А JS обрабатывать разностные коды, но я не уверен, где/как настроить эту информацию.
Я пробовал посмотреть классы AuthenticationFailureHandler
и AuthenticationSuccessHandler
, но они, кажется, даже не используются в моей конфигурации (установка контрольных точек в них даже не попала), поэтому я действительно не понимаю, что/how/where для настройки необходимых обработчиков/фильтров и т. д.