新增身份临时切换功能

This commit is contained in:
shengzhang
2021-01-11 23:10:11 +08:00
parent c7f3b6d493
commit 4bfad95bad
10 changed files with 219 additions and 53 deletions

View File

@@ -1,6 +1,7 @@
# 模拟他人
---
- 以上介绍的api都是操作当前账号对当前账号进行各种鉴权操作你可能会问我能不能对别的账号进行一些操作
- 比如:查看账号`10001`有无某个权限码、获取id账号为`10002`的用户`session`,等等...
- `sa-token`在api设计时充分考虑了这一点暴露出多个api进行此类操作
@@ -8,23 +9,47 @@
## 有关操作其它账号的api
#### StpUtil.getTokenValueByLoginId(Object loginId)
- 获取指定`loginId``tokenValue`
#### StpUtil.logoutByLoginId(Object loginId)
- 指定`loginId`的会话注销登录(踢人下线)
#### StpUtil.getSessionByLoginId(Object loginId)
- 获取指定`loginId``session`(如果此id尚未创建`session`, 则返回`null`)
- 类似API还有
- `StpUtil.getSessionByLoginId(Object loginId, boolean isCreate)` 获取当前会话登录id, `isCreate`代表指定是否在无`session`的情况下新建并返回
#### StpUtil.hasRole(Object loginId, String role)
- 指定`loginId`是否含有指定角色
#### StpUtil.hasPermission(Object loginId, String permission)
- 指定`loginId`是否含有指定权限
``` java
StpUtil.getTokenValueByLoginId(10001); // 获取指定账号10001的`tokenValue`值
StpUtil.logoutByLoginId(10001); // 将账号10001的会话注销登录踢人下线
StpUtil.getSessionByLoginId(10001); // 获取账号10001的Session对象, 如果session尚未创建, 则新建并返回
StpUtil.getSessionByLoginId(10001, false); // 获取账号10001的Session对象, 如果session尚未创建, 则返回null
StpUtil.hasRole(10001, false); // 获取账号10001是否含有指定角色标识
StpUtil.hasPermission(10001, false); // 获取账号10001是否含有指定权限码
```
## 临时身份切换
有时候,我们需要直接将当前会话的身份切换为其它账号,比如:
``` java
StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
StpUtil.getLoginId(); // 此时再调用此方法会返回 10044
StpUtil.endSwitch(); // 结束 [身份临时切换]
```
你还可以: 直接在一个代码段里方法内临时切换身份为指定loginId (此方式无需手动调用`StpUtil.endSwitch()`关闭身份切换)
``` java
System.out.println("------- [身份临时切换]调用开始...");
StpUtil.switchTo(10044, new SaFunction() {
@Override
public void run() {
System.out.println("是否正在身份临时切换中: " + StpUtil.isSwitch());
System.out.println("获取当前登录账号id: " + StpUtil.getLoginId());
}
});
System.out.println("------- [身份临时切换]调用结束...");
```
如果你使用的JDK版本是1.8或以上,上面这一坨可以简写为以下形式:
``` java
System.out.println("------- [身份临时切换]调用开始...");
StpUtil.switchTo(10044, () -> {
System.out.println("是否正在身份临时切换中: " + StpUtil.isSwitch());
System.out.println("获取当前登录账号id: " + StpUtil.getLoginId());
});
System.out.println("------- [身份临时切换]调用结束...");
```

View File

@@ -44,7 +44,7 @@ public class MySaTokenConfig implements WebMvcConfigurer {
registry.addInterceptor(SaRouteInterceptor.createPermissionVal("user:add", "user:deelete")).addPathPatterns("/UserController/**");
// 注册一个自定义认证拦截器 (可以写任意认证代码)
registry.addInterceptor(new SaRouteInterceptor(new SaFunction() {
registry.addInterceptor(new SaRouteInterceptor(new SaRouteFunction() {
@Override
public void run(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 你可以在这里写任意认证代码, 例如: StpUtil.checkLogin();
@@ -52,7 +52,7 @@ public class MySaTokenConfig implements WebMvcConfigurer {
}
})).addPathPatterns("/**");
/** ------ 如果你使用的JDK版本是1.8或以上,上面一坨可以简写为以下形式 ------ */
/** ------ 如果你使用的JDK版本是1.8或以上,上面一坨可以简写为以下形式 ------ */
// 注册一个自定义认证拦截器 (可以写任意认证代码)
registry.addInterceptor(new SaRouteInterceptor((request, response, handler)->{
@@ -66,7 +66,7 @@ public class MySaTokenConfig implements WebMvcConfigurer {
(你不必像上面的示例一样注册所有拦截器,只要按需注册即可
## 3、所有拦截器示例