docs: 文档优化 [路由拦截鉴权] 篇

This commit is contained in:
click33
2025-12-28 17:53:30 +08:00
parent 7e9201584d
commit 5708657f86
6 changed files with 28 additions and 27 deletions

View File

@@ -255,8 +255,8 @@ body{
@media screen and (min-width: 800px) {
[title=s-w],[title=s-w-sh]{max-width: 80%;}
}
[title=s-w-sh]{display: inline-block; border: 1px #eee solid;}
[title=w-100]{display: inline-block; border: 1px #eee solid; max-width: 100%;}
.s-w-sh, [title=s-w-sh]{display: inline-block; border: 1px #eee solid;}
.w-100, [title=w-100]{display: inline-block; border: 1px #eee solid; max-width: 100%;}
/* 鼠标悬浮时切换img */
.hover-change-img {border: 1px #eee solid; max-width: 100%; }

View File

@@ -17,12 +17,12 @@
- `@SaCheckSign`API 签名校验 —— 用于跨系统的 API 签名参数校验。
- `@SaIgnore`:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
Sa-Token 使用全局拦截器完成注解鉴权功能,为了不为项目带来不必要的性能负担,拦截器默认处于关闭状态<br>
因此,为了使用注解鉴权,**你必须手动将 Sa-Token 的全局拦截器注册到你项目中**
Sa-Token 使用全局拦截器完成注解鉴权功能,为了不为项目带来不必要的性能负担,拦截器默认处于关闭状态
因此,为了使用注解鉴权,<green>**你必须手动将 Sa-Token 的全局拦截器注册到你项目中**</green>。
### 1、注册拦截器
`SpringBoot2.0`为例,新建配置类`SaTokenConfigure.java`
SpringBoot2 项目为例,新建配置类`SaTokenConfigure.java`
``` java
@Configuration

View File

@@ -10,7 +10,7 @@
- 管理员账号访问:<green>正常返回数据</green>。
- 普通账号访问:<red>权限不足,拒绝访问</red>。
![基础-权限认证.svg](../big-file/use/use-jur-auth.svg 'w-100')
<img class="w-100" src="/big-file/doc/use/use-jur-auth.svg" />
那么框架是如何判断,一个账号是否有权限访问某个接口的呢?
@@ -20,7 +20,7 @@
- 有,就让你通过。
- 没有?那么禁止访问!
![基础-权限校验.svg](../big-file/use/use-jur-check.svg 'w-100')
<img class="w-100" src="/big-file/doc/use/use-jur-check.svg" />
所以现在问题的核心就是两个:
@@ -174,7 +174,7 @@ StpUtil.hasPermission("index.html"); // false
### 7、如何把权限精确到按钮级
权限精确到按钮级的意思就是指:**权限范围可以控制到页面上的每一个按钮是否显示**。
![基础-按钮级权限.svg](../big-file/use/use-jur-btn.svg 'w-100')
<img class="w-100" src="/big-file/doc/use/use-jur-btn.svg" />
思路:如此精确的范围控制只依赖后端已经难以完成,此时需要前端进行一定的逻辑判断。

View File

@@ -13,7 +13,7 @@
在整个流程中Sa-Token 负责哪些部分呢? 下图可以帮助你理解:
![基础-登录认证流程图.svg](../big-file/use/use-login-auth.svg 'w-100')
<img class="w-100" src="/big-file/doc/use/use-login-auth.svg" />
如上图所示:<green>**无论用户采用何种登录方式,本质上都是通过提交一定的认证信息,使系统可以定位到 Ta 的唯一标识 —— userId**</green>。
@@ -76,7 +76,7 @@ public SaResult doLogin(String name, String pwd) {
- 如果校验通过,则:<green>正常返回数据。</green>
- 如果校验未通过,则:<red>抛出异常,告知其需要先进行登录。</red>
![基础-登录校验流程图.svg](../big-file/use/use-login-check.svg 'w-100')
<img class="w-100" src="/big-file/doc/use/use-login-check.svg" />
<!-- <button class="show-img" img-src="https://oss.dev33.cn/sa-token/doc/g/g3--login-auth.gif">加载动态演示图</button> -->

View File

@@ -1,16 +1,17 @@
# 路由拦截鉴权
假设我们有如下需求:<u>*项目中所有接口均需要登录校验,只有 “登录接口” 本身对外开放*</u>。
如果给每个接口都手动加上注解鉴权,将会是一件比较麻烦的事情,这时候使用拦截器鉴权模式将大大降低我们的代码量。
<!-- ![基础-拦截器鉴权.svg](../big-file/use/use-route-check.svg 'w-100') -->
<img class="w-100" src="/big-file/doc/use/use-route-check.svg" />
如上图所示,拦截器将拦截除登录以外的所以请求,并进行一道前置审核决定是否通过。
---
假设我们有如下需求:
> [!INFO| label:需求场景]
> 项目中所有接口均需要登录认证,只有 “登录接口” 本身对外开放
我们怎么实现呢?给每个接口加上鉴权注解?手写全局拦截器?似乎都不是非常方便。
在这个需求中我们真正需要的是一种基于路由拦截的鉴权模式那么在Sa-Token怎么实现路由拦截鉴权呢
### 1、注册 Sa-Token 路由拦截器
`SpringBoot2.0`为例,新建配置类`SaTokenConfigure.java`
@@ -35,7 +36,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
### 2、校验函数详解
自定义认证规则:`new SaInterceptor(handle -> StpUtil.checkLogin())` 是最简单的写法,代表只进行登录校验功能。
我们可以往构造函数塞一个完整的 lambda 表达式,来定义详细的校验规则,例如:
我们可以往构造函数塞一个完整的 lambda 函数,来定义详细的校验规则,例如:
``` java
@Configuration

View File

@@ -24,7 +24,7 @@ SysUser user = (SysUser) StpUtil.getSession().get("user");
> 有关 Account-Session 与 Token-Session 的详细区别,可参考:[Session模型详解](/fun/session-model)
### Account-Session
### 2、Account-Session
有关 账号-Session 的 API 如下:
``` java
// 获取当前账号 id 的 Account-Session (必须是登录后才能调用)
@@ -44,7 +44,7 @@ StpUtil.getSessionBySessionId("xxxx-xxxx");
```
### Token-Session
### 3、Token-Session
有关 令牌-Session 的 API 如下:
``` java
// 获取当前 Token 的 Token-Session 对象
@@ -55,7 +55,7 @@ StpUtil.getTokenSessionByToken(token);
```
### Custom-Session
### 4、Custom-Session
自定义 Session 指的是以一个`特定的值`作为 SessionId 来分配的`Session`, 借助自定义Session你可以为系统中的任意元素分配相应的session<br>
例如以商品 id 作为 key 为每个商品分配一个Session以便于缓存和商品相关的数据其相关API如下
``` java
@@ -73,7 +73,7 @@ SaSessionCustomUtil.deleteSessionById("goods-10001");
```
### 在 Session 上存取值
### 5、在 Session 上存取值
以上三种 Session 均为框架设计概念上的区分,实际上在获取它们时,返回的都是 SaSession 对象,你可以使用以下 API 在 SaSession 对象上存取值:
@@ -118,7 +118,7 @@ session.keys();
```
### 其它操作
### 6、其它操作
``` java
// 返回此 Session 的id
@@ -138,7 +138,7 @@ session.logout();
```
### 避免与 HttpSession 混淆使用
### 7、避免与 HttpSession 混淆使用
经常有同学会把 `SaSession` 与 `HttpSession` 进行混淆,例如:
``` java
@PostMapping("/resetPoints")
@@ -154,7 +154,7 @@ public void reset(HttpSession session) {
2. `HttpSession`并未被框架接管在使用Sa-Token时请在任何情况下均使用`SaSession`,不要使用`HttpSession`
### 未登录场景下获取 Token-Session
### 8、未登录场景下获取 Token-Session
默认场景下,只有登录后才能通过 `StpUtil.getTokenSession()` 获取 `Token-Session`。