Spring Security 框架在用户成功登录后的处理逻辑,相对来说比较复杂,比较绕,下面我们就关键逻辑,进行相关分析。
首先,框架默认的
AuthenticationSuccessHandler
为
SavedRequestAwareAuthenticationSuccessHandler。
判断当前Request是否缓存(另外需要看 Spring Security 是否开启了 Request 缓存,默认是开启的)。
...... SavedRequest savedRequest = requestCache.getRequest(request, response);if (savedRequest == null) { super.onAuthenticationSuccess(request, response, authentication); return;}......
如果 Spring Security 关闭了 Request 缓存,或者当前 Request 并没有被缓存,那么就走
默认的认证成功逻辑
。
否则,继续根据
alwaysUseDefaultTargetUrl
判断是否永远重定向到
defaultTargetUrl;
亦或是,如果配置了
targetUrlParameter 且当前 request 存在该参数值
,那么,
从缓存中移除当前request,并走默认的认证成功逻辑。
...... String targetUrlParameter = getTargetUrlParameter();if (isAlwaysUseDefaultTargetUrl() || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) { requestCache.removeRequest(request, response); super.onAuthenticationSuccess(request, response, authentication); return;} ......
以上情况都不满足,
即 Spring Security 开启了 Request 缓存,且当前 request 被缓存了,框架即重定向到缓存 request 对应的地址
。
// Use the DefaultSavedRequest URLString targetUrl = savedRequest.getRedirectUrl();logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);getRedirectStrategy().sendRedirect(request, response, targetUrl);
默认的认证成功逻辑,也不复杂,就是判断要重定向的地址这个逻辑,比较繁琐。
protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { if (isAlwaysUseDefaultTargetUrl()) { return defaultTargetUrl; } // Check for the parameter and use that if available String targetUrl = null; if (targetUrlParameter != null) { targetUrl = request.getParameter(targetUrlParameter); if (StringUtils.hasText(targetUrl)) { logger.debug("Found targetUrlParameter in request: " + targetUrl); return targetUrl; } } if (useReferer && !StringUtils.hasLength(targetUrl)) { targetUrl = request.getHeader("Referer"); logger.debug("Using Referer header: " + targetUrl); } if (!StringUtils.hasText(targetUrl)) { targetUrl = defaultTargetUrl; logger.debug("Using default Url: " + targetUrl); } return targetUrl;}
简而言之,就是如果
alwaysUseDefaultTargetUrl
为true,则重定向
defaultTargetUrl;
如果配置了
targetUrlParameter
且其对应的值不为空,则重定向到该地址;如果配置的
useReferer
为
true 且其值不为空
,则重定向到该地址;否则,则重定向到
defaultTargetUrl
。
另外,针对成功登录后的这段复杂逻辑,画了一个流程图,可以参照这些关键代码,加深一下理解
。
Spring Security 框架在用户成功登录后的处理逻辑,相对来说比较复杂,比较绕,下面我们就关键逻辑,进行相关分析。首先,框架默认的 AuthenticationSuccessHandler 为 SavedRequestAwareAuthenticationSuccessHandler。判断当前Request是否缓存(另外需要看 Spring Security 是否开启了 Request ...
Spring
security
自定义
登录页面
,
登录
后仍然
跳转
到
登录页面
死循环的问题
搭建个人博客项目时遇到的bug,查阅多方资料无解,在改了四个小时后发现是csrf关闭失败的原因
spring
boot
2.2.6
spring
security
5
错误的示例
protected void configure(Http
Security
http) throws Except...
问题描述:在集成
cas
后,如果在A应用里面直接调用B应用的某个
页面
,第一次点击的时候总是会
跳转
到B应用设置的默认
页面
,然后再点击的时候,才能
跳转
到正确的
页面
。
后来通过查看源码,发现
[code="java"]类:org.
spring
framework.
security
.web.
authentication
.Abstract
Authentication
TargetUrlRequestHan...
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了学生宿舍信息管理系统的开发全过程。通过分析学生宿舍信息管理系统管理的不足,创建了一个计算机管理学生宿舍信息管理系统的方案。文章介绍了学生宿舍信息管理系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。
本学生宿舍信息管理系统管理员,学生,维修人员,商家四个角色。管理员功能有个人
中
心,班级管理,学生管理,维修人员管理,商家管理,宿舍信息管理,宿舍安排管理,报修信息管理,报修处理管理,假期留宿管理,卫生检查管理,文明宿舍管理,缴费信息管理,桶装水品牌管理,缴费信息管理,桶装水预定管理,物品类别管理,失物信息管理,招领信息管理,系统管理,我的收藏管理等。因而具有一定的实用性。
本站是一个B/S模式系统,采用
Spring
Boot
框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作
中
解脱出来,实现无纸化办公,能够有效的提高学生宿舍信息管理系
1.
配置
文件
中
未
正确设置
CAS
服务端的URL
解决方法:检查
配置
文件
中
`
cas
.server-url-prefix` 的值是否正确设置为
CAS
服务端的URL。
2.
未
正确
配置
CAS
客户端的回调地址
解决方法:检查
配置
文件
中
`
cas
.service` 的值是否正确设置为
CAS
客户端的回调地址。
3.
未
在
CAS
服务端
配置
客户端的回调地址
解决方法:在
CAS
服务端
配置
文件
中
添加客户端的回调地址。
4. 客户端和服务端的时间设置不一致
解决方法:检查客户端和服务端的时间设置是否一致。
5. 缓存
中
没有
CAS
登录
凭证
解决方法:检查
CAS
客户端缓存
中
是否正确保存了
登录
凭证。
希望以上解决方法能够帮到你解决问题。