零、调研下权限系统工具Sa-Token
开源项目-官网入口:Sa-Token
一、功能说明简介
二、项目集成
三、登录认证
四、 权限认证
返回成功示例
无权限示例
五、深入功能
六、单点登录
同域指:c1.domain.com、c2.domain.com、c3.domain.com
①SSO模式一:共享cookie同步会话 参考项目
sa-token-demo-sso1-client
②SSO模式二:URL重定向 参考项目
sa-token-demo-sso2-client
③SSO模式三Http请求 参考项目
sa-token-demo-sso3-client
单点登录步骤:
前提:三系统 server1+client1+client2
1、client1 登录接口/sso/login 携带back回调地址
2、未登录,重定向到sso认证中心server1
3、登录成功,跳转到回调地址,携带ticket码
4、 client1得到ticket码,通过http和密钥去server端校验,成功登录系统
5、client2登录接口/sso/login携带back回调地址
6、重定向到sso认证中心,此时server1已经存在刚才的token,已经认证登陆过,直接跳转client2回调地址,携带ticket码
7、client2校验ticket码通过http和密钥校验有效,成功登陆系统
8、其他数据通过/sso/myinfo接口
9、一键注销
七、OAuth2.0 使用
后续待学习
八、微服务的分布式Session会话 和网关统一鉴权
后续待学习
测试代码git路径
https://gitee.com/feng-qingxuan/satoken-usagehttps://gitee.com/feng-qingxuan/satoken-usage
附录:
常用命令
登录:
StpUtil.login(Object id); //登录会话
StpUtil.logout(); // 当前会话注销登录
StpUtil.isLogin(); //判断是否已登陆true=已登陆,false=未登录
StpUtil.checkLogin();//检查是否登录未登录抛异常` `
StpUtil.getLoginId();//获取会话账号id,未登录抛异常NotLoginException
StpUtil.getLoginIdAsString(); // 获取当前会话账号id, 并转化为`String`类型
StpUtil.getLoginIdAsInt(); // 获取当前会话账号id, 并转化为`int`类型
StpUtil.getLoginIdAsLong(); // 获取当前会话账号id, 并转化为`long`类型
StpUtil.getLoginIdDefaultNull();// 获取当前会话账号id, 如果未登录,则返回null
StpUtil.getLoginId(T defaultValue);//获取会话账号id,未登录返回默认值
踢人:
StpUtil.logout(10001); // 强制指定账号注销下线
StpUtil.logout(10001, "PC"); // 强制指定账号指定端注销下线
StpUtil.logoutByTokenValue("token"); // 强制指定 Token 注销下线
StpUtil.kickout(10001); // 将指定账号踢下线
StpUtil.kickout(10001, "PC"); // 将指定账号指定端踢下线
StpUtil.kickoutByTokenValue("token"); // 将指定 Token 踢下线
StpUtil.disable(10001, 86400); //封禁帐号、id和时长单位秒(86400秒=1天,-1时,代表永久封禁)
StpUtil.isDisable(10001);//获取账号是否被封禁,true被封禁,false未被封禁
StpUtil.getDisableTime(10001);//获取指定账号剩余封禁时间,单位秒
StpUtil.untieDisable(10001); // 解除封禁
//对于一些用户使其立马封号并下线操作
StpUtil.kickout(10001); // 1、先踢下线
StpUtil.disable(10001, 86400); // 2、再封禁账号
权限 -API鉴权
StpUtil.hasPermission("user-update");// 判断:账号是否有指定权限, 返回true或false
StpUtil.checkPermission("user-update");// 校验:账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
StpUtil.checkPermissionAnd("user-update", "user-delete");// 校验:账号权限都满足
StpUtil.checkPermissionOr("user-update", "user-delete"); //校验:账号权限 满足一个即可
StpUtil.hasRole("super-admin");// 判断:当前账号拥有角色, 返回true或false
StpUtil.checkRole("super-admin");// 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
StpUtil.checkRoleAnd("super-admin", "shop-admin");//校验:角色都满足
StpUtil.checkRoleOr("super-admin", "shop-admin");//校验:角色满足一个即可
上帝权限:user* 和 *
权限 -注解式鉴权
@SaCheckLogin: 登录认证 —— 只有登录之后才能进入该方法
@SaCheckRole("admin"): 角色认证 —— 必须具有指定角色标识才能进入该方法
@SaCheckPermission("user:add"): 权限认证 —— 必须具有指定权限才能进入该方法
@SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法
@SaCheckBasic: HttpBasic认证 —— 只有通过 Basic 认证后才能进入该方法
@SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR) 校验模式
@SaCheckPermission(value = "user-add", orRole = "admin") 角色权限双重校验
写法一:orRole = "admin",代表需要拥有角色 admin 。
写法二:orRole = {"admin", "manager", "staff"},代表具有三个角色其一即可。
写法三:orRole = {"admin, manager, staff"},代表必须同时具有三个角色。
操作其他账号&身份切换
StpUtil.getTokenValueByLoginId(10001); // 获取指定账号10001的`tokenValue`值
StpUtil.logout(10001); // 将账号10001的会话注销登录
StpUtil.getSessionByLoginId(10001); // 获取账号10001的Session对象, 如果session尚未创建, 则新建并返回
StpUtil.getSessionByLoginId(10001, false); // 获取账号10001的Session对象, 如果session尚未创建, 则返回null
StpUtil.hasRole(10001, "super-admin");// 获取账号10001是否含有指定角色标识
StpUtil.hasPermission(10001, "user:add");// 获取账号10001是否含有指定权限码
StpUtil.switchTo(10044); // 将当前会话[身份临时切换]为其它账号
StpUtil.getLoginId();// 此时再调用此方法会返回 10044 (我们临时切换到的账号id)
StpUtil.endSwitch();// 结束 [身份临时切换]
StpUtil.switchTo(10044, () -> {
System.out.println("是否正在身份临时切换中: " + StpUtil.isSwitch());
System.out.println("获取当前登录账号id: " + StpUtil.getLoginId());
});
System.out.println("------- [身份临时切换]调用结束...");
同端互斥登录
StpUtil.login(10001, "PC");// 指定`账号id`和`设备标识`进行登录
StpUtil.logout(10001, "PC");// 指定`账号id`和`设备标识`进行强制注销
StpUtil.getLoginDevice();// 返回当前token的登录设备
StpUtil.getTokenValueByLoginId(10001, "APP");// 获取指定loginId指定设备端的tokenValue