完善文档

This commit is contained in:
shengzhang 2021-01-31 23:28:42 +08:00
parent 40331c2e3f
commit 47e879ad5e
16 changed files with 276 additions and 175 deletions

View File

@ -763,7 +763,7 @@ public class StpLogic {
// =================== 角色验证操作 ===================
/**
* 指定账号id是否含有角色标识
* 指定账号id是否含有角色标识, 返回true或false
* @param loginId 账号id
* @param role 角色标识
* @return 是否含有指定角色标识
@ -774,7 +774,7 @@ public class StpLogic {
}
/**
* 当前账号id是否含有指定角色标识
* 当前账号是否含有指定角色标识, 返回true或false
* @param role 角色标识
* @return 是否含有指定角色标识
*/
@ -783,7 +783,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定角色标识没有就抛出异常
* 当前账号是否含有指定角色标识, 如果验证未通过则抛出异常: NotRoleException
* @param role 角色标识
*/
public void checkRole(String role) {
@ -793,7 +793,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定角色标识, [指定多个必须全都有]
* 当前账号是否含有指定角色标识 [指定多个必须全部验证通过]
* @param roleArray 角色标识数组
*/
public void checkRoleAnd(String... roleArray){
@ -807,7 +807,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定角色标识, [指定多个有一个就可以通过]
* 当前账号是否含有指定角色标识 [指定多个只要其一验证通过即可]
* @param roleArray 角色标识数组
*/
public void checkRoleOr(String... roleArray){
@ -828,7 +828,7 @@ public class StpLogic {
// =================== 权限验证操作 ===================
/**
* 指定账号id是否含有指定权限
* 指定账号id是否含有指定权限, 返回true或false
* @param loginId 账号id
* @param permission 权限码
* @return 是否含有指定权限
@ -839,7 +839,7 @@ public class StpLogic {
}
/**
* 当前账号id是否含有指定权限
* 当前账号是否含有指定权限, 返回true或false
* @param permission 权限码
* @return 是否含有指定权限
*/
@ -848,7 +848,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定权限 没有就抛出异常
* 当前账号是否含有指定权限, 如果验证未通过则抛出异常: NotPermissionException
* @param permission 权限码
*/
public void checkPermission(String permission) {
@ -858,7 +858,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定权限, [指定多个必须全都有]
* 当前账号是否含有指定权限 [指定多个必须全部验证通过]
* @param permissionArray 权限码数组
*/
public void checkPermissionAnd(String... permissionArray){
@ -872,7 +872,7 @@ public class StpLogic {
}
/**
* 当前账号是否含有指定权限, [指定多个有一个就可以通过]
* 当前账号是否含有指定权限 [指定多个只要其一验证通过即可]
* @param permissionArray 权限码数组
*/
public void checkPermissionOr(String... permissionArray){

View File

@ -310,7 +310,7 @@ public class StpUtil {
// =================== 角色验证操作 ===================
/**
* 指定账号id是否含有角色标识
* 指定账号id是否含有角色标识, 返回true或false
* @param loginId 账号id
* @param role 角色标识
* @return 是否含有指定角色标识
@ -320,7 +320,7 @@ public class StpUtil {
}
/**
* 当前账号id是否含有指定角色标识
* 当前账号是否含有指定角色标识, 返回true或false
* @param role 角色标识
* @return 是否含有指定角色标识
*/
@ -329,7 +329,7 @@ public class StpUtil {
}
/**
* 当前账号是否含有指定角色标识没有就抛出异常
* 当前账号是否含有指定角色标识, 如果验证未通过则抛出异常: NotRoleException
* @param role 角色标识
*/
public static void checkRole(String role) {
@ -337,7 +337,7 @@ public class StpUtil {
}
/**
* 当前账号是否含有指定角色标识, [指定多个必须全都有]
* 当前账号是否含有指定角色标识 [指定多个必须全部验证通过]
* @param roleArray 角色标识数组
*/
public static void checkRoleAnd(String... roleArray){
@ -345,7 +345,7 @@ public class StpUtil {
}
/**
* 当前账号是否含有指定角色标识, [指定多个有一个就可以通过]
* 当前账号是否含有指定角色标识 [指定多个只要其一验证通过即可]
* @param roleArray 角色标识数组
*/
public static void checkRoleOr(String... roleArray){
@ -356,46 +356,46 @@ public class StpUtil {
// =================== 权限验证操作 ===================
/**
* 指定账号id是否含有指定权限
* 指定账号id是否含有指定权限, 返回true或false
* @param loginId 账号id
* @param permissionCode 权限码
* @param permission 权限码
* @return 是否含有指定权限
*/
public static boolean hasPermission(Object loginId, String permissionCode) {
return stpLogic.hasPermission(loginId, permissionCode);
public static boolean hasPermission(Object loginId, String permission) {
return stpLogic.hasPermission(loginId, permission);
}
/**
* 当前账号id是否含有指定权限
* @param permissionCode 权限码
* 当前账号是否含有指定权限, 返回true或false
* @param permission 权限码
* @return 是否含有指定权限
*/
public static boolean hasPermission(String permissionCode) {
return stpLogic.hasPermission(permissionCode);
public static boolean hasPermission(String permission) {
return stpLogic.hasPermission(permission);
}
/**
* 当前账号是否含有指定权限 没有就抛出异常
* @param permissionCode 权限码
* 当前账号是否含有指定权限, 如果验证未通过则抛出异常: NotPermissionException
* @param permission 权限码
*/
public static void checkPermission(String permissionCode) {
stpLogic.checkPermission(permissionCode);
public static void checkPermission(String permission) {
stpLogic.checkPermission(permission);
}
/**
* 当前账号是否含有指定权限, [指定多个必须全都有]
* @param permissionCodeArray 权限码数组
* 当前账号是否含有指定权限 [指定多个必须全部验证通过]
* @param permissionArray 权限码数组
*/
public static void checkPermissionAnd(String... permissionCodeArray) {
stpLogic.checkPermissionAnd(permissionCodeArray);
public static void checkPermissionAnd(String... permissionArray) {
stpLogic.checkPermissionAnd(permissionArray);
}
/**
* 当前账号是否含有指定权限, [指定多个有一个就可以通过]
* @param permissionCodeArray 权限码数组
* 当前账号是否含有指定权限 [指定多个只要其一验证通过即可]
* @param permissionArray 权限码数组
*/
public static void checkPermissionOr(String... permissionCodeArray) {
stpLogic.checkPermissionOr(permissionCodeArray);
public static void checkPermissionOr(String... permissionArray) {
stpLogic.checkPermissionOr(permissionArray);
}

View File

@ -17,8 +17,9 @@ public class StpInterfaceImpl implements StpInterface {
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object login_id, String login_key) {
List<String> list = new ArrayList<String>(); // 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限
public List<String> getPermissionList(Object loginId, String loginKey) {
// 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user-add");
list.add("user-delete");
@ -33,7 +34,8 @@ public class StpInterfaceImpl implements StpInterface {
*/
@Override
public List<String> getRoleList(Object loginId, String loginKey) {
List<String> list = new ArrayList<String>(); // 本list仅做模拟实际项目中要根据具体业务逻辑来查询角色
// 本list仅做模拟实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;

View File

@ -10,8 +10,8 @@
- [权限验证](/use/jur-auth)
- [Session会话](/use/session)
- [踢人下线](/use/kick)
- [持久层扩展(集成Redis)](/use/dao-extend)
- [无Cookie模式(前后台分离)](/use/not-cookie)
- [持久层扩展集成Redis](/use/dao-extend)
- [无Cookie模式(前后台分离)](/use/not-cookie)
- [模拟他人](/use/mock-person)
- [多账号验证](/use/many-account)
- [同端互斥登录](/use/mutex-login)
@ -29,6 +29,7 @@
- **附录**
- [未登录场景值](/fun/not-login-scene)
- [token有效期详解](/fun/token-timeout)
- [TokenInfo参数详解](/fun/token-info)

View File

@ -0,0 +1,22 @@
# SaTokenInfo 参数详解
token信息Model: 用来描述一个token的常用参数
``` js
{
"code": 200,
"msg": "ok",
"data": {
"tokenName": "satoken", // token名称
"tokenValue": "e67b99f1-3d7a-4a8d-bb2f-e888a0805633", // token值
"isLogin": true, // 此token是否已经登录
"loginId": "10001", // 此token对应的LoginId未登录时为null
"loginKey": "login", // LoginKey账号体系标识
"tokenTimeout": 2591977, // token剩余有效期 (单位: 秒)
"sessionTimeout": 2591977, // User-Session剩余有效时间 (单位: 秒)
"tokenSessionTimeout": -2, // Token-Session剩余有效时间 (单位: 秒)
"tokenActivityTimeout": -1, // token剩余无操作有效时间 (单位: 秒)
"loginDevice": "default-device" // 登录设备标识
},
}
```

View File

@ -3,19 +3,24 @@
---
### 用这个框架我需要很多配置吗?
- 零配置开箱即用,但同时也支持自定义配置:参考:[框架配置](use/config)
零配置开箱即用,但同时也支持自定义配置:参考:[框架配置](use/config)
### 如何踢人下线?
- 参考:[踢人下线](use/kick)
参考:[踢人下线](use/kick)
### 能否集成redis?
- 参考:[持久层扩展](use/dao-extend)
参考:[持久层扩展](use/dao-extend)
### 能否使用在APP、小程序等前后台分离项目中?
- 参考:[无cookie模式](use/not-cookie)
参考:[无cookie模式](use/not-cookie)
### 还是有不明白到的地方?
- 请在`github`提交`issues`或者加入qq群交流群链接在[首页](README?id=交流群)
请在`github`提交`issues`或者加入qq群交流群链接在[首页](README?id=交流群)
### 我能为这个框架贡献代码吗?
- **可以**请参照首页的提交pr步骤 [贡献代码](README?id=贡献代码)
**可以**请参照首页的提交pr步骤 [贡献代码](README?id=贡献代码)

View File

@ -1,9 +1,10 @@
# 示例
本篇将带你从零开始集成sa-token从而让你快速熟悉sa-token的使用姿势 <br>
以maven + springboot为例
---
> - 本篇将带你从零开始集成sa-token从而让你快速熟悉sa-token的使用姿势
> - 以maven + springboot为例
## springboot环境
@ -11,7 +12,7 @@
在IDE中新建一个Springboot项目例如`sa-token-demo-springboot`不会的同学请自行百度或者参考github示例
#### 2、设置jar包依赖
- `pom.xml` 中添加依赖:
`pom.xml` 中添加依赖:
``` xml
<!-- sa-token 权限认证, 在线文档http://sa-token.dev33.cn/ -->
@ -23,8 +24,8 @@
```
#### 3、配置文件
- 你可以**零配置启动项目**
- 但同时你也可以在`application.yml`中增加如下配置,定制性使用框架:
你可以**零配置启动项目** <br>
但同时你也可以在`application.yml`中增加如下配置,定制性使用框架:
``` java
spring:
@ -44,8 +45,8 @@ spring:
token-style: uuid
```
> - 如果你习惯于 `application.properties` 类型的配置文件,那也很好办:
> - 百度: [springboot properties与yml 配置文件的区别](https://www.baidu.com/s?ie=UTF-8&wd=springboot%20properties%E4%B8%8Eyml%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8C%BA%E5%88%AB)
如果你习惯于 `application.properties` 类型的配置文件,那也很好办: <br>
百度: [springboot properties与yml 配置文件的区别](https://www.baidu.com/s?ie=UTF-8&wd=springboot%20properties%E4%B8%8Eyml%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8C%BA%E5%88%AB)
#### 4、创建主类
在项目中新建包 `com.pj` ,在此包内新建主类 `SaTokenDemoApplication.java`,输入以下代码:
@ -67,7 +68,7 @@ public class SaTokenDemoApplication {
## 普通spring环境
- 普通spring环境与springboot环境大体无异只不过需要在项目根目录手动创建配置文件`sa-token.properties`来完成配置
普通spring环境与springboot环境大体无异只不过需要在项目根目录手动创建配置文件`sa-token.properties`来完成配置
## 详细了解

View File

@ -14,7 +14,7 @@
<version>1.12.1</version>
</dependency>
```
优点:兼容性好,缺点:session序列化后基本不可读对开发者来讲等同于乱码
优点:兼容性好,缺点:Session序列化后基本不可读对开发者来讲等同于乱码
### 2. sa-token 整合 Redis (使用jackson序列化方式)
@ -26,7 +26,7 @@
<version>1.12.1</version>
</dependency>
```
优点:session序列化后可读性强可灵活手动修改缺点兼容性稍差
优点:Session序列化后可读性强可灵活手动修改缺点兼容性稍差
<br>

View File

@ -2,21 +2,23 @@
---
## 核心思想
### 核心思想
- 所谓权限验证,验证的核心就是当前账号是否拥有一个权限码
- 有:就让你通过、没有:那么禁止访问
- 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那个权限码
- 例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我去验证权限码:`"user:update"`,则结果就是验证失败,禁止访问
- 所以现在问题的核心就是:
1. 如何获取一个账号所拥有的的权限码集合
2. 本次操作要验证的权限码是哪个
所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 <br/>
有,就让你通过。没有?那么禁止访问!
## 获取当前账号权限码集合
再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包含指定的权限码 <br/>
例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权 `"user:update"`,则结果就是:**验证失败,禁止访问**
所以现在问题的核心就是:
1. 如何获取一个账号所拥有的的权限码集合
2. 本次操作需要验证的权限码是哪个
### 获取当前账号权限码集合
因为每个项目的需求不同,其权限设计也千变万化,【获取当前账号权限码集合】这一操作不可能内置到框架中,
所以`sa-token`将此操作以接口的方式暴露给你,以方便的你根据自己的业务逻辑进行重写
- 你需要做的就是新建一个类,重写`StpInterface`接口,例如以下代码:
你需要做的就是新建一个类,实现`StpInterface`接口,例如以下代码:
``` java
package com.pj.satoken;
@ -29,7 +31,7 @@ import cn.dev33.satoken.stp.StpInterface;
/**
* 自定义权限验证接口扩展
*/
@Component // 保证此类被springboot扫描完成sa-token的自定义权限验证扩展
@Component // 保证此类被SpringBoot扫描完成sa-token的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {
/**
@ -63,31 +65,51 @@ public class StpInterfaceImpl implements StpInterface {
}
```
- 可参考代码:[码云StpInterfaceImpl.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java)
可参考代码:[码云StpInterfaceImpl.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java)
## 验证是否包含指定权限码
### 权限验证
然后就可以用以下api来鉴权了
#### StpUtil.hasPermission(Object pcode)
- 查询当前账号是否含有指定权限返回true或false
``` java
// 当前账号是否含有指定权限, 返回true或false
StpUtil.hasPermission("user:update");
#### StpUtil.checkPermission(Object pcode)
- 检测当前账号是否含有指定权限,如果有则安全通过,如果没有则抛出异常:`NotPermissionException`
- 扩展:`NotPermissionException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
// 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
StpUtil.checkPermission("user:update");
#### StpUtil.checkPermissionAnd(Object... pcode)
- 检测当前账号是否含有指定权限【指定多个,必须全都有,否则抛出异常】
// 当前账号是否含有指定权限 [指定多个,必须全部验证通过]
StpUtil.checkPermissionAnd("user:update", "user:delete");
#### StpUtil.checkPermissionOr(Object... pcode)
- 检测当前账号是否含有指定权限【指定多个,有一个就可以了,全都没有才会抛出异常】
// 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
StpUtil.checkPermissionOr("user:update", "user:delete");
```
扩展:`NotPermissionException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
### 角色验证
在sa-token中角色和权限可以独立验证
``` java
// 当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasRole("user:update");
// 当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
StpUtil.checkRole("user:update");
// 当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
StpUtil.checkRoleAnd("user:update", "user:delete");
// 当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
StpUtil.checkRoleOr("user:update", "user:delete");
```
扩展:`NotRoleException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
## 拦截全局异常
- 有同学要问,鉴权失败,抛出异常,然后呢?要把异常显示给用户看吗?
- 当然不能把异常抛给用户看,你可以创建一个全局异常拦截器,统一返回给前端的格式,例如以下示例:
- 参考:[码云GlobalException.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java)
### 拦截全局异常
有同学要问,鉴权失败,抛出异常,然后呢?要把异常显示给用户看吗?**当然不可以!** <br>
你可以创建一个全局异常拦截器,统一返回给前端的格式,参考:[码云GlobalException.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java)

View File

@ -10,7 +10,7 @@
让指定loginId的会话注销登录踢人下线例如
``` java
// 使账号id为10001的会话注销登录待到10001再次访问系统时会抛出`NotLoginException`异常,场景值为-5
StpUtil.logoutByLoginId(10001);
// 使账号id为10001的会话注销登录待到10001再次访问系统时会抛出`NotLoginException`异常,场景值为-5
StpUtil.logoutByLoginId(10001);
```

View File

@ -2,45 +2,71 @@
---
## 核心思想
### 核心思想
- 所谓登录验证,说白了就是限制某些接口只有登录后才能访问(如:查询我的账号资料)
- 如何判断你有没有登录?当然是登录成功后我给你做个标记
- 在需要鉴权的接口里检查标记,有标记者视为已登录,无标记者视为未登录
- 根据以上思路我们很容易想到以下api
所谓登录验证,说白了就是限制某些接口只有登录后才能访问(如:查询我的账号资料) <br>
那么判断一个会话是否登录的依据是什么?当然是登录成功后框架给你做个标记!然后在需要鉴权的接口里检查此标记,有标记者视为已登录,无标记者视为未登录!
## 具体API
#### StpUtil.setLoginId(Object loginId)
- 标记当前会话登录的账号id
- 建议的参数类型:`long | int | String` 不可以传入复杂类型,如:`User`、`Admin`等等
### 登录与注销
根据以上思路我们很容易想到以下api
#### StpUtil.logout()
- 当前会话注销登录
``` java
// 标记当前会话登录的账号id
// 建议的参数类型long | int | String 不可以传入复杂类型User、Admin等等
StpUtil.setLoginId(Object loginId);
#### StpUtil.isLogin()
- 获取当前会话是否已经登录返回true=已登录false=未登录
// 当前会话注销登录
StpUtil.logout();
#### StpUtil.checkLogin()
- 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
- 扩展:`NotLoginException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
- 扩展:`NotLoginException` 对象可通过 `getType()` 方法获取具体的场景值,详细参考章节:[未登录场景值](/fun/not-login-scene)
// 获取当前会话是否已经登录返回true=已登录false=未登录
StpUtil.isLogin();
#### StpUtil.getLoginId()
- 获取当前会话登录id, 如果未登录,则抛出异常:`NotLoginException`
- 类似API还有
- `StpUtil.getLoginIdAsString()` 获取当前会话登录id, 并转化为`String`类型
- `StpUtil.getLoginIdAsInt()` 获取当前会话登录id, 并转化为`int`类型
- `StpUtil.getLoginIdAsLong()` 获取当前会话登录id, 并转化为`long`类型
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin()
```
#### StpUtil.getLoginId(T defaultValue)
- 获取当前会话登录id, 如果未登录,则返回默认值 `defaultValue`可以为任意类型)
- 类似API还有
- `StpUtil.getLoginIdDefaultNull()` 获取当前会话登录id, 如果未登录则返回null
扩展:`NotLoginException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常 <br>
扩展:`NotLoginException` 对象可通过 `getType()` 方法获取具体的场景值,详细参考章节:[未登录场景值](/fun/not-login-scene)
### 会话查询
``` java
// 获取当前会话登录id, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.getLoginId();
// 类似查询API还有
StpUtil.getLoginIdAsString(); // 获取当前会话登录id, 并转化为`String`类型
StpUtil.getLoginIdAsInt(); // 获取当前会话登录id, 并转化为`int`类型
StpUtil.getLoginIdAsLong(); // 获取当前会话登录id, 并转化为`long`类型
// ---------- 指定未登录情形下返回的默认值 ----------
// 获取当前会话登录id, 如果未登录则返回null
StpUtil.getLoginIdDefaultNull();
// 获取当前会话登录id, 如果未登录,则返回默认值 `defaultValue`可以为任意类型)
StpUtil.getLoginId(T defaultValue);
```
### 其它API
``` java
// 获取指定token对应的登录id如果未登录则返回 null
StpUtil.getLoginIdByToken(String tokenValue);
// 获取当前`StpLogic`的token名称
StpUtil.getTokenName();
// 获取当前会话的token值
StpUtil.getTokenValue();
// 获取当前会话的token信息参数
StpUtil.getTokenInfo();
```
有关TokenInfo参数详解请参考[参考TokenInfo参数详解](/fun/token-info)
#### StpUtil.getLoginIdByToken(String tokenValue)
- 获取指定token对应的登录id如果未登录则返回 null
#### StpUtil.getTokenName()
- 获取当前`StpLogic`的token名称

View File

@ -2,20 +2,32 @@
---
- 以上介绍的api都是操作当前账号对当前账号进行各种鉴权操作你可能会问我能不能对别的账号进行一些操作
- 比如:查看账号`10001`有无某个权限码、获取id账号为`10002`的用户`User-Session`,等等...
- `sa-token`在api设计时充分考虑了这一点暴露出多个api进行此类操作
以上介绍的api都是操作当前账号对当前账号进行各种鉴权操作你可能会问我能不能对别的账号进行一些操作<br>
比如:查看账号`10001`有无某个权限码、获取id账号为`10002`的用户`User-Session`,等等...
sa-token在api设计时充分考虑了这一点暴露出多个api进行此类操作
## 有关操作其它账号的api
``` 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("super-admin"); // 获取账号10001是否含有指定角色标识
StpUtil.hasPermission("user:add"); // 获取账号10001是否含有指定权限码
// 获取指定账号10001的`tokenValue`值
StpUtil.getTokenValueByLoginId(10001);
// 将账号10001的会话注销登录踢人下线
StpUtil.logoutByLoginId(10001);
// 获取账号10001的Session对象, 如果session尚未创建, 则新建并返回
StpUtil.getSessionByLoginId(10001);
// 获取账号10001的Session对象, 如果session尚未创建, 则返回null
StpUtil.getSessionByLoginId(10001, false);
// 获取账号10001是否含有指定角色标识
StpUtil.hasRole("super-admin");
// 获取账号10001是否含有指定权限码
StpUtil.hasPermission("user:add");
```
@ -24,27 +36,19 @@ StpUtil.hasPermission("user:add"); // 获取账号10001是否含有
有时候,我们需要直接将当前会话的身份切换为其它账号,比如:
``` java
StpUtil.switchTo(10044); // 将当前会话[身份临时切换]为其它账号
StpUtil.getLoginId(); // 此时再调用此方法会返回 10044 (我们临时切换到的账号id)
StpUtil.endSwitch(); // 结束 [身份临时切换]
// 将当前会话[身份临时切换]为其它账号
StpUtil.switchTo(10044);
// 此时再调用此方法会返回 10044 (我们临时切换到的账号id)
StpUtil.getLoginId();
// 结束 [身份临时切换]
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());

View File

@ -13,27 +13,31 @@
#### 指定设备标识登录
``` java
StpUtil.setLoginId(10001, "PC"); // 指定`账号id`和`设备标识`进行登录
// 指定`账号id`和`设备标识`进行登录
StpUtil.setLoginId(10001, "PC");
```
调用此方法登录后,同设备的会被顶下线(不同设备不受影响),再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-4`
#### 指定设备标识强制注销
``` java
StpUtil.logoutByLoginId(10001, "PC"); // 指定`账号id`和`设备标识`进行强制注销 (踢人下线)
// 指定`账号id`和`设备标识`进行强制注销 (踢人下线)
StpUtil.logoutByLoginId(10001, "PC");
```
如果第二个参数填写null或不填代表将这个账号id所有在线端踢下线被踢出者再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-5`
#### 查询当前登录的设备标识
``` java
StpUtil.getLoginDevice(); // 指返回当前token的登录设备
// 返回当前token的登录设备
StpUtil.getLoginDevice();
```
#### id反查token
``` java
StpUtil.getTokenValueByLoginId(10001, "APP"); // 获取指定loginId指定设备端的tokenValue
// 获取指定loginId指定设备端的tokenValue
StpUtil.getTokenValueByLoginId(10001, "APP");
```

View File

@ -1,7 +1,7 @@
# 无cookie模式
---
### 何为无cookie
### 何为无cookie?
- 常规PC端鉴权方法一般由`cookie`进行
- 而`cookie`有两个特性1、可由后端控制写入2、每次请求自动提交

View File

@ -8,19 +8,14 @@ sa-token提供以下API助你直接操作会话列表
## 具体API
#### 查询所有token
``` java
// 查询所有token
StpUtil.searchTokenValue(String keyword, int start, int size);
```
#### 查询所有账号Session会话
``` java
// 查询所有账号Session会话
StpUtil.searchSessionId(String keyword, int start, int size);
```
#### 查询所有令牌Session会话
``` java
// 查询所有令牌Session会话
StpUtil.searchTokenSessionId(String keyword, int start, int size);
```

View File

@ -2,43 +2,62 @@
---
Session是会话中专业的数据缓存组件在`sa-token`中Session分为三种, 分别是:
- `账号Session`: 指的是框架为每个`loginId`分配的`Session`
- `令牌Session`: 指的是框架为每个`token`分配的`Session`
- `User-Session`: 指的是框架为每个`loginId`分配的`Session`
- `Token-Session`: 指的是框架为每个`token`分配的`Session`
- `自定义Session`: 指的是以一个`特定的值`作为SessionId来分配的`Session`
## 账号Session
### User-Session
有关账号Session的API如下
``` java
StpUtil.getSession(); // 获取当前账号id的Session (必须是登录后才能调用)
StpUtil.getSession(true); // 获取当前账号id的Session, 并决定在Session尚未创建时是否新建并返回
StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session
StpUtil.getSessionByLoginId(10001, true); // 获取账号id为10001的Session, 并决定在Session尚未创建时是否新建并返回
StpUtil.getSessionBySessionId("xxxx-xxxx"); // 获取SessionId为xxxx-xxxx的Session, 在Session尚未创建时, 返回null
// 获取当前账号id的Session (必须是登录后才能调用)
StpUtil.getSession();
// 获取当前账号id的Session, 并决定在Session尚未创建时是否新建并返回
StpUtil.getSession(true);
// 获取账号id为10001的Session
StpUtil.getSessionByLoginId(10001);
// 获取账号id为10001的Session, 并决定在Session尚未创建时是否新建并返回
StpUtil.getSessionByLoginId(10001, true);
// 获取SessionId为xxxx-xxxx的Session, 在Session尚未创建时, 返回null
StpUtil.getSessionBySessionId("xxxx-xxxx");
```
## 令牌Session
### Token-Session
有关令牌Session的API如下
``` java
StpUtil.getTokenSession(); // 获取当前token的专属Session
StpUtil.getTokenSessionByToken(token); // 获取指定token的专属Session
// 获取当前token的专属Session
StpUtil.getTokenSession();
// 获取指定token的专属Session
StpUtil.getTokenSessionByToken(token);
```
在未登录状态下是否可以获取`Token-Session`?这取决于你配置的`tokenSessionCheckLogin`值是否为false详见[框架配置](/use/config?id=所有可配置项)
## 自定义Session
### 自定义Session
自定义Session指的是以一个`特定的值`作为SessionId来分配的`Session`, 借助自定义Session你可以为系统中的任意元素分配相应的session<br>
例如以商品id作为key为每个商品分配一个Session以便于缓存和商品相关的数据其相关API如下
``` java
SaSessionCustomUtil.isExists("goods-10001"); // 查询指定key的Session是否存在
SaSessionCustomUtil.getSessionById("goods-10001"); // 获取指定key的Session如果没有则新建并返回
SaSessionCustomUtil.getSessionById("goods-10001", false); // 获取指定key的Session如果没有第二个参数决定是否新建并返回
SaSessionCustomUtil.deleteSessionById("goods-10001"); // 删除指定key的Session
// 查询指定key的Session是否存在
SaSessionCustomUtil.isExists("goods-10001");
// 获取指定key的Session如果没有则新建并返回
SaSessionCustomUtil.getSessionById("goods-10001");
// 获取指定key的Session如果没有第二个参数决定是否新建并返回
SaSessionCustomUtil.getSessionById("goods-10001", false);
// 删除指定key的Session
SaSessionCustomUtil.deleteSessionById("goods-10001");
```
在未登录状态下是否可以获取令牌Session这取决于你配置的`tokenSessionCheckLogin`值是否为false详见[框架配置](/use/config?id=所有可配置项)
## Session相关操作
### Session相关操作
那么获取到的`SaSession`具体有哪些方法可供操作?
``` java
session.getId(); // 返回此Session的id
@ -50,9 +69,9 @@ session.removeAttribute('name'); // 在Session上移除一个值
session.clearAttribute(); // 清空此Session的所有值
session.containsAttribute('name'); // 获取此Session是否含有指定key (返回true或false)
session.attributeKeys(); // 获取此Session会话上所有key (返回Set<String>)
session.getDataMap(); // 返回此Session会话上的底层数据对象如果更新map里的值请调用session.update()方法避免数据过时
session.getDataMap(); // 返回此Session会话上的底层数据对象如果更新map里的值请调用session.update()方法避免产生脏数据)
session.update(); // 将这个Session从持久库更新一下
session.logout(); // 注销此Session会话
session.logout(); // 注销此Session会话 (从持久库删除此Session)
```
具体可参考`javax.servlet.http.HttpSession``SaSession`所含方法与其大体类似