建设网站方案网页休闲游戏网站
news/
2025/10/4 10:41:54/
文章来源:
建设网站方案,网页休闲游戏网站,住房和城乡建设部注册中心网站,门户网站导航建设方案关于单点登录
单点登录的基本实现思想#xff1a; 当客户端提交登录请求时#xff0c;服务器端在验证登录成功后#xff0c;将生成此用户对应的JWT数据#xff0c;并响应到客户端 客户端在后续的访问中#xff0c;将自行携带JWT数据发起请求#xff0c;通常#xff0c…关于单点登录
单点登录的基本实现思想 当客户端提交登录请求时服务器端在验证登录成功后将生成此用户对应的JWT数据并响应到客户端 客户端在后续的访问中将自行携带JWT数据发起请求通常JWT数据会放在请求头的Authorization属性中 在服务器端的任何服务都可以解析JWT数据从而创建对应的Authentication对象然后将Authentication对象存入到SecurityContext中
目前在之前[SpringBoot]Spring Security框架_万物更新_的博客-CSDN博客已经实现的代码有几个问题 如何退出登录客户端丢弃JWT即可 服务器端如何保证客户端真的丢弃了JWT 如果第三方盗用了JWT如何处理 目前的代码中将管理员的权限列表存储在JWT中导致JWT数据太长并且权限数据应该视为敏感数据不应该表现在JWT中 以上问题都可以结合Redis的应用来解决解决方案如下 退出登录的问题 【推荐】【解决方案1】当验证登录成功后将JWT存入到Redis中在处理JWT数据的过滤器JwtAuthorizationFilter中首先检查Redis中的信息如果此JWT在Redis中存在例如白名单则视为有效所以当退出登录时只需要在Redis中将对应的JWT删除即可 【解决方案2】当退出登录时将JWT存入到Redis中在处理JWT数据的过滤器JwtAuthorizationFilter中首先检查Redis中的信息如果此JWT在Redis中的“黑名单”中则视为无效 盗用JWT的问题 【判断标准】以“IP地址相同或设备信息相同”为真正用户的判断标准即如果IP地址与登录时不同且设备信息与登录时的也不同则视为“盗用” 【实现手段】当用户提交登录请求时就需要获取用户的IP地址与设备信息当验证登录通过后将此用户的JWT、IP地址、设备信息全部存入到Redis中后续当客户端提交请求后在JwtAuthorizationFilter中根据客户端请求中携带的JWT检查此次请求时的IP、设备信息与此前在Redis中存入的是否相同如果两者均不同则视为“盗用”。 携带权限列表的问题 不再将权限列表保存在JWT数据中而是存在Redis中 所以基于以上分析在处理单点登录时Redis中的数据大概是
KeyValue用户1的JWT用户1的登录时IP地址、设备信息、权限列表用户2的JWT用户2的登录时IP地址、设备信息、权限列表
基于以上做法还可以更加【实时的】、有效的管理用户信息例如将用户的启用状态也存入到Redis中每次请求时都需要检查同时当用户的启用状态发生变化时更新Redis中的数据 关于以上问题的具体解决方案
接收客户端的登录请求时需要获取客户端的IP地址和设备信息浏览器信息例如 AdminController.java remoteAddr就是它的ip地址userAgent就是浏览器的设备信息然后传入service里面去。
当验证登录通过后将JWT作为Key把相关信息IP地址、浏览器信息、用户的权限列表、用户的启用状态等作为值存入到Redis中并且JWT中不再包含权限列表
AdminServiceImpl.java 以上jwt调整为只存入 id和用户名。 以上往redis里面去存专门准备了一个AdminLoginInfoPO对象 /*** 管理员登录信息的存储对象主要用于写入到Redis中** author javatedu.cn* version 0.0.1*/
Data
public class AdminLoginInfoPO implements Serializable {/*** 管理员ID*/private Long id;/*** 管理员的启用状态*/private Integer enable;/*** 管理员登录时的IP地址*/private String remoteAddr;/*** 管理员登录时的浏览器版本*/private String userAgent;/*** 管理员的权限列表的JSON字符串*/private String authorityListJsonString;}时长是存入redis里面的有效时长。
在JwtAuthorizationFilter中当接收到JWT后基于此JWT从Redis中获取信息如果获取不到有效信息则此JWT视为无效的当可以获取到相关信息时检查此用户的状态检查IP地址、浏览器信息最终生成Authentication时权限也是来自Redis中读取到的数据 回头其他的管理员把这个号禁用了redis里面就因该把它改为0所以以下对它做一个检查如果0就是被禁用了从而去响应信息 最后以前的权限信息是从解析jwt来得调整为从redis获取对象解析得到authorities得到权限列表这个权限信息就用于去创建认证信息最后放在jwt里面 关于退出登录 以上通过RequestHeader注解就得到jwt了这个注解表示数据是来自请求头的。 以上把jwt删了后续就是一个不认的状态了退出登录就处理好了。 关于jwt过期的问题 在上面的代码中我们对jwt设置了过期的如果这个jwt过期了因该怎么办比如用户还在逛某宝是在没用的时候过期了去登录是合理的如果在逛的时候过期了需要登录就不合理。 解决办法是在解析jwt的时候是能得到剩余有效期的以下可以看出jwt包含过期时间所以我们可以制定一个标准临近过期时间就给它续上。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927032.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!