2014-01-15 2 views
0

Я новичок в 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 для настройки необходимых обработчиков/фильтров и т. д.

ответ

0

Вы можете попробовать использовать отказе в доступе обработчик в вашем HTTP тегом что-то вроде этого

<http auto-config="true"> 
<intercept-url pattern="/admin*" access="ROLE_ADMIN" /> 
<access-denied-handler ref="accessDeniedHandler"/> 

<bean id="accessDeniedHandler" 
class="CustomAccessDeniedHandler"> 
<property name="accessDeniedUrl" value="acessDenied" /> 

Вы можете создать свой собственный обработчик, реализующий Spring в AccessDeniedHandler, а затем переопределить handle().

public class CustomAccessDeniedHandler implements AccessDeniedHandler { 

    private String accessDeniedUrl; 

    public String getAccessDeniedUrl() { 
    return accessDeniedUrl; 
} 

public void setAccessDeniedUrl(String accessDeniedUrl) { 
    this.accessDeniedUrl = accessDeniedUrl; 
} 

@Override 
public void handle(HttpServletRequest request, 
    HttpServletResponse response, 
    AccessDeniedException accessDeniedException) throws IOException, 
    ServletException { 

     // Your own logic something like this 

    response.sendRedirect(accessDeniedUrl); 
    request.getSession().setAttribute("message", 
    "You do not have permission to access this page!"); 

} 

}

accesDenied.jsp может быть что-то вроде этого

<html> 
<body> 
<h1>HTTP Status 403 - Access is denied</h1> 
<h3>Message : ${message}</h3>  
</body> 
</html> 
Смежные вопросы