sa-token/sa-token-doc/doc/use/login-auth.md

119 lines
3.4 KiB
Markdown
Raw Normal View History

2021-04-30 23:48:12 +08:00
# 登录认证
2020-02-06 00:52:49 +08:00
---
2021-01-31 23:28:42 +08:00
### 核心思想
2020-02-06 00:52:49 +08:00
2021-07-21 14:39:50 +08:00
所谓登录认证说白了就是限制某些API接口必须登录后才能访问查询我的账号资料 <br>
那么如何判断一个会话是否登录?框架会在登录成功后给你做个标记,每次登录认证时校验这个标记,有标记者视为已登录,无标记者视为未登录!
2020-02-06 00:52:49 +08:00
2021-01-31 23:28:42 +08:00
### 登录与注销
根据以上思路我们很容易想到以下api
2020-02-06 00:52:49 +08:00
2021-01-31 23:28:42 +08:00
``` java
// 标记当前会话登录的账号id
// 建议的参数类型long | int | String 不可以传入复杂类型User、Admin等等
2021-06-16 20:24:23 +08:00
StpUtil.login(Object id);
2020-02-06 00:52:49 +08:00
2021-01-31 23:28:42 +08:00
// 当前会话注销登录
StpUtil.logout();
2020-02-06 00:52:49 +08:00
2021-01-31 23:28:42 +08:00
// 获取当前会话是否已经登录返回true=已登录false=未登录
StpUtil.isLogin();
2020-05-02 15:19:55 +08:00
2021-01-31 23:28:42 +08:00
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin()
```
2020-02-06 00:52:49 +08:00
2021-07-21 14:39:50 +08:00
##### `NotLoginException`异常对象扩展:
1. 通过 `getLoginType()` 方法获取具体是哪个 `StpLogic` 抛出的异常 <br>
2. 通过 `getType()` 方法获取具体的场景值,详细参考章节:[未登录场景值](/fun/not-login-scene)
2021-01-31 23:28:42 +08:00
### 会话查询
``` java
2021-07-21 14:39:50 +08:00
// 获取当前会话账号id, 如果未登录,则抛出异常:`NotLoginException`
2021-01-31 23:28:42 +08:00
StpUtil.getLoginId();
// 类似查询API还有
2021-07-21 14:39:50 +08:00
StpUtil.getLoginIdAsString(); // 获取当前会话账号id, 并转化为`String`类型
StpUtil.getLoginIdAsInt(); // 获取当前会话账号id, 并转化为`int`类型
StpUtil.getLoginIdAsLong(); // 获取当前会话账号id, 并转化为`long`类型
2021-01-31 23:28:42 +08:00
// ---------- 指定未登录情形下返回的默认值 ----------
2021-07-21 14:39:50 +08:00
// 获取当前会话账号id, 如果未登录则返回null
2021-01-31 23:28:42 +08:00
StpUtil.getLoginIdDefaultNull();
2021-07-21 14:39:50 +08:00
// 获取当前会话账号id, 如果未登录,则返回默认值 `defaultValue`可以为任意类型)
2021-01-31 23:28:42 +08:00
StpUtil.getLoginId(T defaultValue);
```
### 其它API
``` java
2021-07-21 14:39:50 +08:00
// 获取指定token对应的账号id如果未登录则返回 null
2021-01-31 23:28:42 +08:00
StpUtil.getLoginIdByToken(String tokenValue);
// 获取当前`StpLogic`的token名称
StpUtil.getTokenName();
// 获取当前会话的token值
StpUtil.getTokenValue();
// 获取当前会话的token信息参数
StpUtil.getTokenInfo();
```
2021-09-14 22:18:42 +08:00
### 来个小测试,加深一下理解
新建 `LoginController`,复制以下代码
``` java
/**
* 登录测试
* @author kong
*
*/
@RestController
@RequestMapping("/acc/")
public class LoginController {
// 测试登录 ---- http://localhost:8081/acc/doLogin?name=zhang&pwd=123456
@RequestMapping("doLogin")
public SaResult doLogin(String name, String pwd) {
// 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
if("zhang".equals(name) && "123456".equals(pwd)) {
StpUtil.login(10001);
return SaResult.ok("登录成功");
}
return SaResult.error("登录失败");
}
// 查询登录状态 ---- http://localhost:8081/acc/isLogin
@RequestMapping("isLogin")
public SaResult isLogin() {
return SaResult.ok("是否登录:" + StpUtil.isLogin());
}
2021-10-21 02:43:27 +08:00
// 查询 Token 信息 ---- http://localhost:8081/acc/tokenInfo
@RequestMapping("tokenInfo")
public SaResult tokenInfo() {
return SaResult.data(StpUtil.getTokenInfo());
}
2021-09-14 22:18:42 +08:00
// 测试注销 ---- http://localhost:8081/acc/logout
@RequestMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok();
}
}
```
> 有关`TokenInfo`参数详解,请参考:[TokenInfo参数详解](/fun/token-info)
2020-02-06 00:52:49 +08:00