04-用户登录和鉴权

1. 方案选择

  • 方案一(session):整合Spring security,同时将session缓存到redis实现集群化管理
  • 方案二(token): 通过jwt生成token,每次请求都携带此token,后端通过拦截器解析token

两种方案各有优缺点,盒子IM早期采用的是方案一,但是遇到了两个问题:

  • 同一个浏览器无法同时登陆多个账号:第2个账号登录时,会自动顶掉第一个账号的session
  • ws连接校验不容易实现: session是通过http的header中的sessionId实现,因此与http协议是强捆绑关系,并不支持ws协议

所以最后改用了方案二,也就是使用token的方式

2. 交互流程

  1.  

    2.1. 获取token

    d2b5ca33bd20250831141340

    主要步骤代码:

    步骤
    类名
    方法
    1,2,3,4
    UserServiceImpl
    login

    2.2. token校验

    1. token的校验通过拦截器实现,对所有接口(除登录等个别接口)进行统一拦截校验:

      d2b5ca33bd20250831141355

      图中只是已请求用户消息接口为例,其他请求亦是如此。主要步骤代码:

      步骤
      类名
      方法
      2
      AuthInterceptor
      preHandle

     

     

    2.3. 刷新token

    accessToken的过期时间只有半个小时,而refreshToken7天才会过期。

    当accessToken过期时,需要调用/refreshToken接口,换取新的token。

主要步骤代码:
步骤
类名
方法
1,2,3,4
UserServiceImpl
refreshToken
 

3. 用户无感知刷新token

上一小节中介绍了当token过期时如何去换取新的token,那么问题来了,程序应该如何感知到token已经过期了呢?

  • 方案一:前端用定时器对token的过期时间进行检测,如果快过期了,则进行token刷新
  • 方案二:通过前端的http拦截器实现,用户发请求时被此拦截器捕获,此时如果发现token过期时,进行刷新token,然后重新发起请求

显然方案二更为优雅,所以盒子IM采用是方案二。

主要实现代码(前端):

目录
文件名
方法
im-web/src/api/
httpRequest.js
所有
im-uniapp/common/
request.js
所有
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容