SimpleAdmin手摸手教学之:登录鉴权

一、前言

不管是作为一个后台管理系统,还是客户端应用系统,登录都是一个必备的功能,基本上每个程序员都写过登录接口,基本就是用户输入账号密码然后去数据查比对是否一样,一样就返回登录成功,不一样就返回登录失败。当然这只是登录最简单的实现,其实登录是一个非常有技术含量的功能,本系统没有使用任何权限框架,而是基于JWT+Redis 自己手撸实现的一套鉴权逻辑,采用了B、C端多账号体系认证,B端代表后台用户,C端代表前台用户,可以根据不同的端来处理登录逻辑,目前只实现了B端登录,如需C端请自行扩展。

二、登录设计

本系统中登录分为账号密码登录、手机号登录和第三方登录,目前已经实现前面两种,第三种需要自己拓展实现。

2.1 账号密码登录

基本流程图:

进入登录页面之后会读取系统配置判断是否需要验证码,如果需要验证码就会去请求验证码接口获取验证码并显示在页面上。

除了用户名密码,还需要将验证码和请求号传入登录接口供后端验证,不然这个验证码就形同虚设了。

后端接收到前端传过来的账号密码和验证码,判断验证码是否正确,解密之后的密码是否和数据库一致,如果吻合,则生成token返回给前端

在ExecLoginB方法中,主要会做三件事:

  1. 生成token:前端拿到token去请求接口
  2. 将token写入redis:只有redis存在的token才有权限请求接口
  3. 发布登录事件总线:更新用户信息,登录Ip等信息。

2.2 手机号登录

基本流程图:

点击获取验证码按钮获取短信验证码

接下的流程就和账号密码登录一样了,携带手机号和验证码取请求手机登录接口就行。

三、单用户登录

单用户登录是指在同一时间,同一客户端只允许一个人访问系统,当用户登录之后,其他已经登录的用户将被强制下线。本系统默认是多用户登录的,也就是一个账号可以在多个浏览器登录,想要开启单用户登录,只需要在系统设置里打开单用户登录开关就行。

原理也是很简单,我们登录之后的token都会存在redis,当用户请求接口的时候会携带redis,如果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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章