SimpleAdmin手摸手教学之:登录鉴权
一、前言
不管是作为一个后台管理系统,还是客户端应用系统,登录都是一个必备的功能,基本上每个程序员都写过登录接口,基本就是用户输入账号密码然后去数据查比对是否一样,一样就返回登录成功,不一样就返回登录失败。当然这只是登录最简单的实现,其实登录是一个非常有技术含量的功能,本系统没有使用任何权限框架,而是基于JWT
+Redis
自己手撸实现的一套鉴权逻辑,采用了B、C端多账号体系认证,B端代表后台用户,C端代表前台用户,可以根据不同的端来处理登录逻辑,目前只实现了B端登录,如需C端请自行扩展。
二、登录设计
本系统中登录分为账号密码
登录、手机号
登录和第三方
登录,目前已经实现前面两种,第三种需要自己拓展实现。
2.1 账号密码登录
基本流程图:
进入登录页面之后会读取系统配置判断是否需要验证码
,如果需要验证码就会去请求验证码接口获取验证码并显示在页面上。
除了用户名密码,还需要将验证码和请求号传入登录接口供后端验证,不然这个验证码就形同虚设了。
后端接收到前端传过来的账号密码和验证码,判断验证码是否正确,解密之后的密码是否和数据库一致,如果吻合,则生成token返回给前端
在ExecLoginB方法中,主要会做三件事:
生成token
:前端拿到token去请求接口将token写入redis
:只有redis存在的token才有权限请求接口发布登录事件总线
:更新用户信息,登录Ip等信息。
redis存储token采用hash
得方式存储,key为用户id。
2.2 手机号登录
基本流程图:
点击获取验证码
按钮获取短信验证码
接下的流程就和账号密码登录一样了,携带手机号和验证码取请求手机登录接口就行。
三、单用户登录
单用户登录是指在同一时间,同一客户端只允许一个人访问系统,当用户登录之后,其他已经登录的用户将被强制下线。本系统默认是多用户登录的,也就是一个账号可以在多个浏览器登录,想要开启单用户登录,只需要在系统设置里打开单用户登录开关就行。
原理也是很简单,我们登录之后的token都会存在redis
,当用户请求接口的时候会携带token
,如果redis有该token就允许请求,否则返回401
,这里我们只要将其他token
给去了,只留当前用户的token。
顺便通知其他用户下线。
其他用户会收到下线消息。
四、自动刷新token
自动刷新token,也叫无感刷新,因为我们使用的是token认证,但是token又是无状态的,token到期之后携带请求会报401错误,如果用户用的好好的突然需要重新登录,那么用户体验就不是很好,所以我们需要系统后台刷新token,而因为我们使用的Furion
框架,可以非常容易的实现该功能。
4.1 后端登录部分
当用户登录成功之后,返回 accessToken
字符串,之后通过 JWTEncryption.GenerateRefreshToken()
获取 刷新Token
,并通过响应报文头返回,用户登录成功之后把 accessToken
和 refreshToken
一起返回给客户端存储起来。
4.2 后端授权 Handler
部分
JwtHandler中重写授权处理
当自动刷新token之后,存储在redis中的token也需要更新。
4.3 客户端部分
客户端每次请求需将 accessToken
和 refreshToken
放到请求报文头中传送到服务端,格式为:
Authorization: Bearer 你的token
X-Authorization: Bearer 你的刷新token
具体体现在前端项目中的utils
文件夹中的request.js
,通过前端通过decryptJWT
方法解析token,判断是否快过期了。
如果 Token
过期,那么 Furion
将自动根据有效期内的 refreshToken
自动生成新的 AccessToken
,并在 响应报文头 中返回,如
access-token: 新的token
x-access-token: 新的刷新token
前端需要获取 响应报文头
新的 token 和刷新 token 替换之前在客户处存储旧的 token 和刷新 token。
五、会话管理
用户登录成功之后,token信息会存入redis,这样我们就可以通过读取redis中得信息知道当前系统中有多少用户登录了。具体体现在系统运维
->会话管理
中。
除了查看当前有多少用户登录之外,还能看到每个用户的token列表,表示有多少个用户同时用这一个账号登录,我们可以强制使用户下线,原理很简单就是在redis中把当前token给删除了,那么该用户下次请求接口就会返回401。
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/17034445.html,欢迎加入qq群927460240学习讨论