开源链接:https://github.com/dromara/sa-token
今天,要和大家推荐一个超级棒的开源项目,据说它号称是史上功能最全的 Java 权限认证框架!
sa-token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题。
框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过sa-token,你可以以一种极简的方式实现系统的权限认证部分,与其它权限认证框架相比,sa-token 具有以下优势:
简单 :可零配置启动框架,真正的开箱即用,低成本上手
强大 :目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案
易用 :如丝般顺滑的API调用,大量高级特性统统只需一行代码即可实现
高扩展 :几乎所有组件都提供了扩展接口,90%以上的逻辑都可以按需重写
Sa-Token具有以下功能特性:
登录验证 —— 轻松登录鉴权,并提供五种细分场景值
权限验证 —— 适配RBAC权限模型,不同角色不同授权
Session会话 —— 专业的数据缓存中心
踢人下线 —— 将违规用户立刻清退下线
持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失
分布式会话 —— 提供jwt集成和共享数据中心两种分布式会话方案
单点登录 —— 一处登录,处处通行
模拟他人账号 —— 实时操作任意用户状态数据
临时身份切换 —— 将会话身份临时切换为其它账号
无Cookie模式 —— APP、小程序等前后台分离场景
同端互斥登录 —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录
多账号认证体系 —— 比如一个商城项目的user表和admin表分开鉴权
花式token生成 —— 内置六种token风格,还可自定义token生成策略
注解式鉴权 —— 优雅的将鉴权与业务代码分离
路由拦截式鉴权 —— 根据路由拦截鉴权,可适配restful模式
自动续签 —— 提供两种token过期策略,灵活搭配使用,还可自动续签
会话治理 —— 提供方便灵活的会话查询接口
记住我模式 —— 适配[记住我]模式,重启浏览器免验证
密码加密 —— 提供密码加密模块,可快速MD5、SHA1、SHA256、AES、RSA加密
组件自动注入 —— 零配置与Spring等框架集成
代码示例
sa-token的API调用非常简单,有多简单呢?以登录验证为例,你只需要:
// 在登录时写入当前会话的账号id
StpUtil.setLoginId(10001);
// 然后在任意需要校验登录处调用以下API
// 如果当前会话未登录,这句代码会抛出 `NotLoginException`异常
StpUtil.checkLogin();
在sa-token中,登录授权就是如此的简单,不需要什么全局过滤器,不需要各种乱七八糟的配置,只需要这一行简单的API调用,即可完成会话的登录授权。
权限认证示例(只有具有user:add权限的会话才可以进入请求)
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
// ...
return "用户增加";
}
将某个账号踢下线 (待到对方再次访问系统时会抛出NotLoginException异常)
// 使账号id为10001的会话注销登录
StpUtil.logoutByLoginId(10001);
除了以上的示例,sa-token还可以一行代码完成以下功能:
StpUtil.setLoginId(10001); // 标记当前会话登录的账号id
StpUtil.getLoginId(); // 获取当前会话登录的账号id
StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false
StpUtil.logout(); // 当前会话注销登录
StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线)
StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false
StpUtil.getSession(); // 获取当前账号id的Session
StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session
StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值
StpUtil.setLoginId(10001, "PC"); // 指定设备标识登录
StpUtil.logoutByLoginId(10001, "PC"); // 指定设备标识进行强制注销 (不同端不受影响)
StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号