
java记住我_记住我remember-me功能的⼏种实现⽅式
本⽂讨论⼏种“记住我”功能的实现⽅式。
原理:⽤户登录后,服务端为⽤户⽣成⼀个Token,并放⼊客户端Cookie中。下次⽤户登录,服务端验证Cookie中的Token并⾃动登录。
简单的Token⽣成⽅法
Token=MD5Hex(urname+分隔符+expiryTime+分隔符+password)
CookieValue=Ba64(urname+分隔符+expiryTime+分隔符+Token)
urname:⽤户名。
password:⽤户密码。
expiryTime:Token的失效时间,以毫秒表⽰。
该⽅法⽣成的Token不需要持久化,每次⽣成时失效时间不同,可保证Token不同(也可以在Token中增加⼀些变量,如系统配置的key)。
⽤户第⼀次登陆时⽣成Token;
第⼆次打开系统时,根据CookieValue中urname查询数据库,并重新⽣成Token,验证⽤户提交Token是否正确,如果正确成功登⼊系
统,如果不正确,调整到登陆页⾯。
存在安全问题。
当⽤户Cookie被窃取(HttpOnly增加安全性),任何⽤户都可以在Token失效之前登录。发现被盗⽤,可以修改password来使Token失
效,或者系统在⽤户每次登⼊系统时都重新⽣成Token。
缺点:由于Token没有持久化,所以需要从已知的变量(如urname、password、expiryTime)重新⽣成来验证,password即使加密放
⼊前台,也不是⼀个好的解决⽅法。纵然不使⽤password,也需要其他变量来保证Token的可靠性。
持久化的Token⽣成⽅法
Token的⽣成规则可以⾃定义,只要保证每次urname的Token不⼀样就可,例如采⽤16位随机数(如Java的SecureRandom)。规则同
上⾯类似,只是将Token与⽤户信息解耦。但是安全问题依旧存在。
持久化Token⽣成⽅法并验证Cookie是否被窃取
Token:随机⽣成策略,只要保证urname唯⼀性。
ries:登录序列号,随机⽣成策略。⽤户输⼊⽤户名和密码登录时,该值重新⽣成。使⽤remember-me功能,该值保持不变,重新⽣成
Token。
expiryTime:Token过期时间。
1)每次⽤户选择记住我并登录后,都重新随机⽣成ries、Token,保存到数据库和前端Cookie中。
2)下⼀次⽤户再次访问系统,
情况⼀:前台Cookie中保存的ries值在数据库中不存在,跳转到登录页⾯。
情况⼆:ries、Token与数据库中⼀致,则仍为合法⽤户,并保持ries不变,重新随机⽣成Token,覆盖前台Cookie值。
情况三:ries在数据库中存在,但Token不⼀致,说明Cookie被窃取。
情况⼀、同⽤户相同浏览器访问系统
情况⼀、同⽤户相同浏览器访问系统
情况⼆、同⽤户不同浏览器访问系统
情况⼆、同⽤户不同浏览器访问系统
情况三、Cookie被盗
情况三、Cookie被盗
安全问题依然存在。
a. 可以考虑⽤户访问等级,如⽤户名密码登录级别最⾼,⽽对于Token记住我登录次之,对于⼀些重要的业务操作时(如⽀付),还是需要进
⾏⽤户⾝份认证。
b. 还可以考虑⽤户IP,但现在移动⽤户,经常切换WiFi和⽹络,所以IP也会发⽣变化。例如⼿机银⾏(如招⾏客户端)切换⽹络后,需要重新
登录,提⾼安全性。
c. 还可以考虑,⽤户常⽤IP、城市等安全策略。

本文发布于:2023-05-25 11:52:23,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1684986745176455.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java记住我_记住我remember-me功能的几种实现方式.doc
本文 PDF 下载地址:java记住我_记住我remember-me功能的几种实现方式.pdf
| 留言与评论(共有 0 条评论) |