mirror of
https://gitee.com/dromara/sa-token.git
synced 2026-06-10 03:07:34 +08:00
docs: 文档优化 [路由拦截鉴权] 篇
This commit is contained in:
@@ -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%; }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
- 管理员账号访问:<green>正常返回数据</green>。
|
||||
- 普通账号访问:<red>权限不足,拒绝访问</red>。
|
||||
|
||||

|
||||
<img class="w-100" src="/big-file/doc/use/use-jur-auth.svg" />
|
||||
|
||||
|
||||
那么框架是如何判断,一个账号是否有权限访问某个接口的呢?
|
||||
@@ -20,7 +20,7 @@
|
||||
- 有,就让你通过。
|
||||
- 没有?那么禁止访问!
|
||||
|
||||

|
||||
<img class="w-100" src="/big-file/doc/use/use-jur-check.svg" />
|
||||
|
||||
|
||||
所以现在问题的核心就是两个:
|
||||
@@ -174,7 +174,7 @@ StpUtil.hasPermission("index.html"); // false
|
||||
### 7、如何把权限精确到按钮级?
|
||||
权限精确到按钮级的意思就是指:**权限范围可以控制到页面上的每一个按钮是否显示**。
|
||||
|
||||

|
||||
<img class="w-100" src="/big-file/doc/use/use-jur-btn.svg" />
|
||||
|
||||
思路:如此精确的范围控制只依赖后端已经难以完成,此时需要前端进行一定的逻辑判断。
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
在整个流程中,Sa-Token 负责哪些部分呢? 下图可以帮助你理解:
|
||||
|
||||

|
||||
<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>
|
||||
|
||||

|
||||
<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> -->
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
# 路由拦截鉴权
|
||||
|
||||
假设我们有如下需求:<u>*项目中所有接口均需要登录校验,只有 “登录接口” 本身对外开放*</u>。
|
||||
|
||||
如果给每个接口都手动加上注解鉴权,将会是一件比较麻烦的事情,这时候使用拦截器鉴权模式将大大降低我们的代码量。
|
||||
|
||||
<!--  -->
|
||||
|
||||
<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
|
||||
|
||||
@@ -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`。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user