mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-05-10 07:37:56 +08:00
完善多账号体系鉴权文档
This commit is contained in:
parent
60fdc4ca2a
commit
73843741af
@ -50,12 +50,72 @@ public class StpUserUtil {
|
|||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
4. 接下来就可以像调用`StpUtil.java`一样调用 `StpUserUtil.java`了,这两套账号认证的逻辑是完全隔离的。
|
|
||||||
|
|
||||||
> 成品样例参考:[码云 StpUserUtil.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java)
|
成品样例参考:[码云 StpUserUtil.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java)
|
||||||
|
|
||||||
|
4、接下来就可以像调用`StpUtil.java`一样调用 `StpUserUtil.java`了,这两套账号认证的逻辑是完全隔离的。例如:
|
||||||
|
|
||||||
|
``` java
|
||||||
|
// 凡是在 StpUtil 上有的方法,都可以在 StpUserUtil 上调用
|
||||||
|
StpUserUtil.login(10001); // 在当前会话以10001账号进行登录
|
||||||
|
StpUserUtil.checkLogin(); // 校验当前账号是否以 User 身份进行登录
|
||||||
|
StpUserUtil.getSession(); // 获取当前 User 账号的 Access-Session 对象
|
||||||
|
StpUserUtil.checkPermission('xx'); // 校验当前登录的 user 账号是否具有 xx 权限
|
||||||
|
// ...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### 5、在多账户模式下使用注解鉴权
|
### 5、Kit模式
|
||||||
|
如果你觉得 “复制代码” 的方式繁琐不够优雅,这里还有另一种方案:建立一个 `StpKit.java` 门面类,声明所有的 `StpLogic` 引用:
|
||||||
|
``` java
|
||||||
|
/**
|
||||||
|
* StpLogic 门面类,管理项目中所有的 StpLogic 账号体系
|
||||||
|
*/
|
||||||
|
public class StpKit {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认原生会话对象
|
||||||
|
*/
|
||||||
|
public static final StpLogic DEFAULT = StpUtil.stpLogic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Admin 会话对象,管理 Admin 表所有账号的登录、权限认证
|
||||||
|
*/
|
||||||
|
public static final StpLogic ADMIN = new StpLogic("admin");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User 会话对象,管理 User 表所有账号的登录、权限认证
|
||||||
|
*/
|
||||||
|
public static final StpLogic USER = new StpLogic("user");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XX 会话对象,(项目中有多少套账号表,就声明几个 StpLogic 会话对象)
|
||||||
|
*/
|
||||||
|
public static final StpLogic XXX = new StpLogic("xx");
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
在需要登录、权限认证的地方:
|
||||||
|
``` java
|
||||||
|
// 在当前会话进行 Admin 账号登录
|
||||||
|
StpKit.ADMIN.login(10001);
|
||||||
|
|
||||||
|
// 在当前会话进行 User 账号登录
|
||||||
|
StpKit.USER.login(10001);
|
||||||
|
|
||||||
|
// 检测当前会话是否以 Admin 账号登录,并具有 article:add 权限
|
||||||
|
StpKit.ADMIN.checkPermission("article:add");
|
||||||
|
|
||||||
|
// 检测当前会话是否以 User 账号登录,并通过了二级认证
|
||||||
|
StpKit.USER.checkSafe();
|
||||||
|
|
||||||
|
// 获取当前 User 会话的 Session 对象,并进行写值操作
|
||||||
|
StpKit.USER.getSession().set("name", "zhang");
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 6、在多账户模式下使用注解鉴权
|
||||||
框架默认的注解鉴权 如`@SaCheckLogin` 只针对原生`StpUtil`进行鉴权。
|
框架默认的注解鉴权 如`@SaCheckLogin` 只针对原生`StpUtil`进行鉴权。
|
||||||
|
|
||||||
例如,我们在一个方法上加上`@SaCheckLogin`注解,这个注解只会放行通过`StpUtil.login(id)`进行登录的会话,
|
例如,我们在一个方法上加上`@SaCheckLogin`注解,这个注解只会放行通过`StpUtil.login(id)`进行登录的会话,
|
||||||
@ -74,9 +134,8 @@ public String info() {
|
|||||||
|
|
||||||
注:`@SaCheckRole("xxx")`、`@SaCheckPermission("xxx")`同理,亦可根据type属性指定其校验的账号体系,此属性默认为`""`,代表使用原生`StpUtil`账号体系。
|
注:`@SaCheckRole("xxx")`、`@SaCheckPermission("xxx")`同理,亦可根据type属性指定其校验的账号体系,此属性默认为`""`,代表使用原生`StpUtil`账号体系。
|
||||||
|
|
||||||
> 使用注解必须[添加注解拦截器](/use/at-check)
|
|
||||||
|
|
||||||
### 6、使用注解合并简化代码
|
### 7、使用注解合并简化代码
|
||||||
交流群里有同学反应,虽然可以根据 `@SaCheckLogin(type = "user")` 指定账号类型,但几十上百个注解都加上这个的话,还是有些繁琐,代码也不够优雅,有么有更简单的解决方案?
|
交流群里有同学反应,虽然可以根据 `@SaCheckLogin(type = "user")` 指定账号类型,但几十上百个注解都加上这个的话,还是有些繁琐,代码也不够优雅,有么有更简单的解决方案?
|
||||||
|
|
||||||
我们期待一种`[注解继承/合并]`的能力,即:自定义一个注解,标注上`@SaCheckLogin(type = "user")`,
|
我们期待一种`[注解继承/合并]`的能力,即:自定义一个注解,标注上`@SaCheckLogin(type = "user")`,
|
||||||
@ -130,14 +189,14 @@ public String info() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 8、同端多登陆
|
||||||
### 7、同端多登陆
|
|
||||||
假设我们不仅需要在后台同时集成两套账号,我们还需要在一个客户端同时登陆两套账号(业务场景举例:一个APP中可以同时登陆商家账号和用户账号)。
|
假设我们不仅需要在后台同时集成两套账号,我们还需要在一个客户端同时登陆两套账号(业务场景举例:一个APP中可以同时登陆商家账号和用户账号)。
|
||||||
|
|
||||||
如果我们不做任何特殊处理的话,在客户端会发生`token覆盖`,新登录的token会覆盖掉旧登录的token从而导致旧登录失效。
|
如果我们不做任何特殊处理的话,在客户端会发生`token覆盖`,新登录的 token 会覆盖掉旧登录的 token 从而导致旧登录失效。
|
||||||
|
|
||||||
那么如何解决这个问题?<br>
|
具体表现大致为:在一个浏览器登录商家账号后,再登录用户账号,然后商家账号的登录态就会自动失效。
|
||||||
很简单,我们只要更改一下 `StpUserUtil` 的 `TokenName` 即可,参考示例如下:
|
|
||||||
|
那么如何解决这个问题?很简单,我们只要更改一下 `StpUserUtil` 的 `TokenName` 即可,参考示例如下:
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
public class StpUserUtil {
|
public class StpUserUtil {
|
||||||
@ -157,10 +216,10 @@ public class StpUserUtil {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
再次调用 `StpUserUtil.login(10001)` 进行登录授权时,token的名称将不再是 `satoken`,而是我们重写后的 `satoken-user`。
|
再次调用 `StpUserUtil.login(10001)` 进行登录授权时,token的名称将不再是 `satoken`,而是我们重写后的 `satoken-user`,这样就不会再客户端发生 token 的相互覆盖了。
|
||||||
|
|
||||||
|
|
||||||
### 8、不同体系不同 SaTokenConfig 配置
|
### 9、不同体系不同 SaTokenConfig 配置
|
||||||
如果自定义的 StpUserUtil 需要使用不同 SaTokenConfig 对象, 也很简单,参考示例如下:
|
如果自定义的 StpUserUtil 需要使用不同 SaTokenConfig 对象, 也很简单,参考示例如下:
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
@ -190,7 +249,8 @@ public class SaTokenConfigure {
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 9、多账号体系混合鉴权
|
|
||||||
|
### 10、多账号体系混合鉴权
|
||||||
QQ群中经常有小伙伴提问:在多账号体系下,怎么在 SaInterceptor 拦截器中给一个接口登录鉴权?
|
QQ群中经常有小伙伴提问:在多账号体系下,怎么在 SaInterceptor 拦截器中给一个接口登录鉴权?
|
||||||
|
|
||||||
其实这个问题,主要是靠你的业务需求来决定,以后台 Admin 账号和前台 User 账号为例:
|
其实这个问题,主要是靠你的业务需求来决定,以后台 Admin 账号和前台 User 账号为例:
|
||||||
|
Loading…
Reference in New Issue
Block a user