https://sa-token.cc/doc.html#/
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

-- auto-generated definition create table auth_user ( id bigint auto_increment comment '主键' primary key, user_name varchar(32) null comment '用户名称/账号', nick_name varchar(32) null comment '昵称', email varchar(32) null comment '邮箱', phone varchar(32) null comment '手机号', password varchar(64) null comment '密码', sex tinyint(2) null comment '性别', avatar varchar(255) null comment '头像', status tinyint(2) null comment '状态 0启用 1禁用', introduce varchar(255) null comment '个人介绍', ext_json varchar(255) null comment '特殊字段', created_by varchar(32) null comment '创建人', created_time datetime null comment '创建时间', update_by varchar(32) null comment '更新人', update_time datetime null comment '更新时间', is_deleted int default 0 null comment '是否被删除 0未删除 1已删除' ) comment '用户信息表' charset = utf8; -- auto-generated definition create table auth_role ( id bigint auto_increment primary key, role_name varchar(32) null comment '角色名称', role_key varchar(64) null comment '角色唯一标识', created_by varchar(32) null comment '创建人', created_time datetime null comment '创建时间', update_by varchar(32) null comment '更新人', update_time datetime null comment '更新时间', is_deleted int default 0 null comment '是否被删除 0未删除 1已删除' ) charset = utf8; -- auto-generated definition create table auth_user_role ( id bigint auto_increment comment '主键' primary key, user_id bigint null comment '用户id', role_id bigint null comment '角色id', created_by varchar(32) null comment '创建人', created_time datetime null comment '创建时间', update_by varchar(32) null comment '更新人', update_time datetime null comment '更新时间', is_deleted int default 0 null ) comment '用户角色表' charset = utf8; -- auto-generated definition create table auth_permission ( id bigint auto_increment primary key, name varchar(64) null comment '权限名称', parent_id bigint null comment '父id', type tinyint null comment '权限类型 0菜单 1操作', menu_url varchar(255) null comment '菜单路由', status tinyint(2) null comment '状态 0启用 1禁用', `show` tinyint(2) null comment '展示状态 0展示 1隐藏', icon varchar(128) null comment '图标', permission_key varchar(64) null comment '权限唯一标识', created_by varchar(32) null comment '创建人', created_time datetime null comment '创建时间', update_by varchar(32) null comment '更新人', update_time datetime null comment '更新时间', is_deleted int default 0 null comment '是否被删除 0为删除 1已删除' ) charset = utf8; -- auto-generated definition create table auth_role_permission ( id bigint auto_increment primary key, role_id bigint null comment '角色id', permission_id bigint null comment '权限id', created_by varchar(32) null comment '创建人', created_time datetime null comment '创建时间', update_by varchar(32) null comment '更新人', update_time datetime null comment '更新时间', is_deleted int default 0 null ) comment '角色权限关联表' charset = utf8; 


1、短信的方式,通过向手机号发送验证码,来实现用户的验证并登录(考虑的成本是短信的费用)
2、邮箱的注册登录。
用户注册的时候,留一个邮箱,我们往邮箱里通过邮箱服务器发送一个链接,用户点击之后,实现一个激活,激活成功之后就完成了注册。(0 成本,坏处这种发送的邮件很容易进垃圾箱)
3、个人公众号模式(个人开发者无公司的,比较适合使用,0 成本)
用户登录的时候,弹出我们的这个公众号的码。扫码后,用户输入我们提示的验证码。可以随机比如说 nadbuge,通过我们的公众号对接的回调。能拿到一定的信息,用户的 openId。进而记录用户的信息
4、企业的服务号(必须要有营业执照,自己玩的不上线的话,也可以用测试号)
好处就是不仅打通了各种回调,而且还能拿到用户的信息。
传统的 pc 形式,都是登录之后,写入 cookie。前端再次请求的时候,带着 cookie 一个身份识别就可以完成认证。坏处是什么?小程序呀,app 呀,其实是没有 cookie 这个概念的。为了更好的扩展,我们就直接选择 token的模式。token 放入 header 来实现用户身份的识别与鉴权。
发现风险用户,可以通过后台直接把用户踢掉,禁止其再访问,token 也可以直接置为失效的形式。
如果说我们选择了 token,然后不做 token 的保存,服务重启呀,分布式微服务啊,数据是无法共享并且会产生丢失问题,所以用 redis 来存储一些信息,实现共享。
校验权限,校验用户的角色等等的东西,我们就放在网关里面统一去做。
不放在网关,导致我们的每个微服务,全要引入的鉴权的框架,不断的去写重复的代码。
数据的权限获取产生问题:
1、网关直接对接数据库,实现查询
2、redis 中获取数据,获取不到的时候还是要像第一种一样去数据库里查。
3、redis 中获取缓存,没有的话,从 auth 服务里面获取相关的信息。
4、直接从 redis 读取。