最近项目用户登录的要求有所提高,必须单实例登录,要提供记住密码功能,用户登录后会有交易所以必须尽可能提高安全性,所以设计了一下用户登录结构
IP:用户IP,用于区分用户登录所在位置
User:用户名(用户名+Id的Hash串),用于识别用户
Token:用户口令(MD5离散随机数),用于区分单实例登录(每次登录或刷新SessionCache都会更新)
Series:用户序列(MD5离散随机数),用于强制用户登录会话失效重新登录(密码发生变更时更新)
一、首先我们要确定两个规则
1、每次登陆或刷新Session都要更新Token(确保同一时间只有一个会话登录)
2、任何密码变更都需要更新Series(确保之前登录信息失效)
二、cookie中我们保存两种信息(自行选择如何加密)
不记住密码
1、Name
2、Token
记住密码
1、Name
2、Token
3、Series
三、获取用户客户端IP来区分客户位置
四、处理普通会话与记住密码会话的逻辑
在这里是核心判断的位置,我们从Cookie中拿到所需的内容,判断一下Cache中是否有这些会话信息,如果没有可以直接跳转登录页,
如果有再进行以下判断:
1、Name是否与Cache一致
2、IP是否与Cache一致(验证当前为同一个实例访问)
3、Token是否与Cache一致(验证当前为同一个实例登录)
4、Series是否与DB一致(验证当前账户未更新过密码)
结果:
2不一致(用户访问位置异常)
3不一致(用户登录异常)
异常登录提示账户风险,可以引导用户修改密码
4不一致(更新过密码)
可以引导用户重新登录
如果是记住密码那Cache没有就不能直接跳回登录页了,而是核实一下Cookie的内容自动登录,登录需要核实一下几点:
1、Name是否与DB一致
2、Series是否与DB一致
3、酌情判断常用IP记录里是否有当前IP
如果通过作如下操作:
新建Session Cache
存入新Token等
五、我们将Session存到Cache中,大部分用户信息在DB中
总体设计如下图(图太大了可以图片另存为下载查看):
一点见解,IP部分不好控制还需要调优,如果有建议还望指导,谢谢