【问题标题】:Ajax security using SpringMVC and jQuery使用 SpringMVC 和 jQuery 的 Ajax 安全性
【发布时间】:2014-02-04 07:22:18
【问题描述】:

我是使用 jQuery 的 Spring Security 和 Spring MVC 的新手。我的 Spring Security 是基于 Spring Security 参考文档的非常基本的设置。我正在使用 Spring 3.2.4。

<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 处理差异代码,但不确定在哪里/如何配置该信息。

我试过查看AuthenticationFailureHandlerAuthenticationSuccessHandler 类,但它们似乎甚至没有在我的配置中使用(在它们中设置断点甚至都没有命中),所以我真的很茫然了解什么/如何/在哪里配置必要的处理程序/过滤器/等。

【问题讨论】:

    标签: jquery authentication spring-mvc spring-security


    【解决方案1】:

    你可以尝试在你的 http 标签中使用 access-denied-handler 像这样

    <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>
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多