零、调研下权限系统工具Sa-Token

开源项目-官网入口:Sa-Token

一、功能说明简介

二、项目集成

 

 三、登录认证

 

四、 权限认证

权限定义和角色定义由实现自定义接口
StpInterfaceImpl à getPermissionList (Object loginId , String loginType 返回一个账号所拥有的权限码集合
StpInterfaceImpl à getRoleList (Object loginId , String loginType ) 返回一个账号所拥有的角色标识集合
权限支持通配符:比“ user*” "*"

 

 

 返回成功示例

 无权限示例

 

 五、深入功能

同时具备:拦截器、过滤器、侦听器、 sa -session 、记住我、模拟他人登录、同端互斥登录等
拦截器: addInterceptors  路由拦截鉴权
过滤器: getSaServletFilter 路由拦截鉴权
侦听器: SaTokenListener 监听登录、注销、封号、踢下线、解封
SA-session :和 HttpSession 作用类似,独立 session 系统
记住我:给浏览器写入永久 Cookie
模拟他人登录:

 

 六、单点登录

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

同域指:c1.domain.comc2.domain.comc3.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   

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐