当CSRF与Spring Security集成时,会话超时导致Spring MVC中的Access Denied

 失和孔洞_943 发布于 2022-12-04 00:25

我在Spring MVC项目中使用Spring Security集成了CSRF令牌.使用CSRF令牌一切正常,令牌将从客户端发送到服务器端.

我已经改变了我的logout进程,使其成为POST发送CSRF令牌的方法,并且其工作正常.

发生会话超时时我遇到问题,需要将其重定向到弹出默认注销URL,但它会为我Access Denied提供该URL.

如何覆盖此行为.

我在安全配置文件中包含以下行

   
         //Other config parameters
        
   

如果有人需要更多信息,请告诉我.

1 个回答
  • 问题有点旧,但答案总是有用的.

    首先,这是会话支持的CSRF令牌的已知问题,如文档中所述:CSRF警告 - 超时.

    要解决此问题,请使用一些Javascript来检测即将发生的超时,使用与会话无关的CSRF令牌存储库或创建自定义AccessDeniedHandler路由.我选择后者:

    配置XML:

    <http>
        <!-- ... -->
        <access-denied-handler ref="myAccessDeniedHandler"/>
    </http>
    
    <bean id="myAccessDeniedHandler" class="package.MyAccessDeniedHandler">
        <!-- <constructor-arg ref="myInvalidSessionStrategy" /> -->
    </bean>
    

    MyAccessDeniedHandler:

    public class MyAccessDeniedHandler implements AccessDeniedHandler {
        /* ... */
        @Override
        public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception)
                throws IOException, ServletException {
            if (exception instanceof MissingCsrfTokenException) {
                /* Handle as a session timeout (redirect, etc).
                Even better if you inject the InvalidSessionStrategy
                used by your SessionManagementFilter, like this:
                invalidSessionStrategy.onInvalidSessionDetected(request, response);
                */
            } else {
                /* Redirect to a error page, send HTTP 403, etc. */
            }
        }
    }
    

    或者,您可以将自定义处理程序定义为DelegatingAccessDeniedHandler:

    <bean id="myAccessDeniedHandler" class="org.springframework.security.web.access.DelegatingAccessDeniedHandler">
        <constructor-arg name="handlers">
            <map>
                <entry key="org.springframework.security.web.csrf.MissingCsrfTokenException">
                    <bean class="org.springframework.security.web.session.InvalidSessionAccessDeniedHandler">
                        <constructor-arg name="invalidSessionStrategy" ref="myInvalidSessionStrategy" />
                    </bean>
                </entry>
            </map>
        </constructor-arg>
        <constructor-arg name="defaultHandler">
            <bean class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
                <property name="errorPage" value="/my_error_page"/>
            </bean>
        </constructor-arg>
    </bean>
    

    2022-12-11 03:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有