spring security使用自定义登录界面后,不能返回到之前的请求界面的问题

Posted 这是一个博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring security使用自定义登录界面后,不能返回到之前的请求界面的问题相关的知识,希望对你有一定的参考价值。

昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录。

开始以为是被oauth2拦截了导致出了问题,但是security的拦截器是优先起作用的,所以这不可能。

最后实在没法只有打断点调试找毛病(下图为spring security登录后重定向至拦截前访问的url的实现原理流程)

 

图片是在这里看到的https://blog.csdn.net/zy_cookie/article/details/49535413

 

从图上可以看出保存 被拦截的request是在 这个类里进行的

HttpSessionRequestCache

在IDEA里搜索这个类,在saveRequest方法设置一个断点,然后进行调试

调试发现当浏览器输入权限限制的url时(如/admin/console),系统会调用saveRequest方法对当前request对象进行缓存(如下图所示)

 

 既然保存的是/admin/console,但是为啥取出来的是/呢,继续执行就发现问题了,系统又调用了一次saveRequest方法,而这次保存的request对象是“/”路径的

也就是说之前保存的就是被这个给覆盖了,通过源码可以发现,saveRequest方法中是把request对象缓存到session,而且key值为静态值(由此可见如果我们想要自定义一些方法时可以通过该key值取出保存的request对象,不过系统也提供了getRequst方法)

 

 

根据流程图可知只有被拦截的请求才会被捕获保存起来,于是我去检查我webSercurityConfig,发现除了静态资源其他的资源全都需要验证,也因此“/”根目录被拦截了,把“/”添加到排除列表后问题解决

通过后续的调试发现“/”是因为我自定义的登录页面发出的该请求

 

值得注意的是spring security完成用户登录后跳转会原页面的处理是在

SavedRequestAwareAuthenticationSuccessHandler类里面进行的,如果想要自定义登录成功后的操作可以继承该类,重写该方法

 

不过我当时写的时候因为生成的代码里自动生成调用父类的该方法导致获取不到saveRequest(就是下面这行)

原因是在

SavedRequestAwareAuthenticationSuccessHandler类处理时,获取到saveRequst后会对session中缓存的进行删除

 


 

以上是关于spring security使用自定义登录界面后,不能返回到之前的请求界面的问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security3.0怎样自定义登录,后台自定义参数传递

自定义登录表单无法使用 Spring Security

认证与授权Spring Security自定义页面

认证与授权Spring Security自定义页面

01-Spring Security框架学习--入门

Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址