权限认证开源框架Sa-Token文档阅读

我在网上查询资料的时候,谷歌搜索到了一个开源框架的文档,我发现这份文档的资料很齐全,觉得完全可以作为学习资料记录一下。

框架名是:Sa-Token,一个轻量级 Java 权限认证框架。

地址是:https://sa-token.cc/doc.html

阅读这份文档,需要一定的Java基础,看完后会对某些国外的Java框架会心一笑(说的就是你,复杂的SpringSecurity)

Session

最先浮现的是 JSP 中的 HttpSession,工作原理可以大致总结为:

客户端每次与服务器第一次握手时,会被强制分配一个 [唯一id] 作为身份标识,注入到 Cookie 之中, 之后每次发起请求时,客户端都要将它提交到后台,服务器根据 [唯一id] 找到每个请求专属的Session对象,维持会话。

这种机制简单粗暴,但是缺点明显,有:

  1. 同一账号分别在PC、APP登录,会被识别为两个不相干的会话
  2. 一个设备难以同时登录两个账号
  3. 每次一个新的客户端访问服务器时,都会产生一个新的Session对象,即使这个客户端只访问了一次页面
  4. 在不支持Cookie的客户端下,这种机制会失效

Cookie ,本质上就是一个特殊的header参数而已, 而既然它只是一个 header 参数,我们就能手动模拟实现它,从而完成鉴权操作。

常规 Web 端鉴权方法,一般由 Cookie模式 完成,而 Cookie 有两个特性:

  1. 可由后端控制写入。
  2. 每次请求自动提交。

这就使得我们在前端代码中,无需任何特殊操作,就能完成鉴权的全部流程(因为整个流程都是后端控制完成的)

而在app、小程序等前后端分离场景中,没有 Cookie 功能的,解决方案是:

  1. 不能后端控制写入了,就前端自己写入。(难点在后端如何将 Token 传递到前端)
  2. 每次请求不能自动提交了,那就手动提交。(难点在前端如何将 Token 传递到后端,同时后端将其读取出来)

拦截器和过滤器

既然拦截器已经可以实现路由鉴权,为什么还要用过滤器再实现一遍呢?原因:

  1. 相比于拦截器,过滤器更加底层,执行时机更靠前,有利于防渗透扫描。
  2. 过滤器可以拦截静态资源,方便我们做一些权限控制。
  3. 部分Web框架根本就没有提供拦截器功能,但几乎所有的Web框架都会提供过滤器机制。

但是过滤器也有一些缺点,比如:

  1. 由于太过底层,导致无法率先拿到HandlerMethod对象,无法据此添加一些额外功能。
  2. 由于拦截的太全面了,导致我们需要对很多特殊路由(如/favicon.ico)做一些额外处理。
  3. 在Spring中,过滤器中抛出的异常无法进入全局@ExceptionHandler,我们必须额外编写代码进行异常处理。

单点登录SSO

系统被切割为N个部分:商城、论坛、直播、社交等,如果用户每访问一个模块都要登录一次,那么用户将会疯掉, 为了优化用户体验,需一套机制将这N个系统的认证授权互通共享,让用户在一个系统登录之后,便可以畅通无阻的访问其它所有系统。

单点登录,就是为了解决这个问题而生

单点登录可以做到: 在多个互相信任的系统中,用户只需登录一次,就可以访问所有系统。

JWT

在某些系统中,前端提交token时会在前面加个固定的前缀,Bearer ,这是 json web token (jwt),关于jwt的介绍直接看阮一峰的网站:

https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

总结

Sa-Token是一个很好的开源权限框架,未来如果我有需要搭建一套权限系统,我会直接使用Sa-Token,它的文档非常齐全、详细,这是很重要的,还有常见问题和解答,这一些可以帮助我们快速上手和解决问题。

同样的,从Sa-Token文档中,我看到了一份优秀的文档网站是很优质的学习网站,相同的我们也可以去阿里云、腾讯云的官网文档中学习,这些官网文档的质量挺高,内容也全,值得学习。

哈,未来的代码注释和文档,我也要写详细、准确一些。