Compare commits

...

66 Commits

Author SHA1 Message Date
click33
2fc76c767e docs: 新增赞赏码展示 2026-01-24 05:30:22 +08:00
click33
cefa368f4d docs: 文档首页新增 stars 对比图 2026-01-24 04:19:42 +08:00
click33
84795e9014 docs: 新增解决跨域专题文章 2026-01-24 04:18:28 +08:00
click33
f8d57189e0 docs: 移除 Gitee 2025 投票提示 2026-01-24 04:17:54 +08:00
click33
4cbb0849a7 perf: 优化 readme 2025-12-30 22:59:06 +08:00
click33
b1723e5424 refactor: 注释优化 2025-12-29 02:08:12 +08:00
click33
196d34be20 docs: team.md 优化 2025-12-29 02:00:20 +08:00
click33
ff3ce7daa5 docs: 图片地址更换为本地文件 (附录篇) 2025-12-29 01:44:28 +08:00
click33
f61d8369ac docs: 图片地址更换为本地文件 (插件篇) 2025-12-29 01:19:15 +08:00
click33
a27739f344 docs: 图片地址更换为本地文件 (微服务篇) 2025-12-29 01:02:23 +08:00
click33
9378da7a91 docs: 图片地址更换为本地文件 (OAuth2篇) 2025-12-29 00:41:34 +08:00
click33
47e8e91056 docs: 图片地址更换为本地文件 (SSO篇) 2025-12-29 00:25:06 +08:00
click33
e7c09e81d7 docs: 图片地址更换为本地文件 (深入篇) 2025-12-29 00:03:35 +08:00
click33
6cd765ce91 docs: 图片地址更换为本地文件 (基础篇) 2025-12-28 23:49:34 +08:00
click33
d646099127 docs: index.html & doc.html 引用图片替换为本地 2025-12-28 22:44:15 +08:00
click33
5708657f86 docs: 文档优化 [路由拦截鉴权] 篇 2025-12-28 17:53:30 +08:00
click33
7e9201584d docs: 文档优化 [权限认证] 篇 2025-12-28 12:32:02 +08:00
click33
a6a1b9b865 docs: 文档优化 [登录认证] 篇 2025-12-27 16:47:49 +08:00
click33
4b7e6d651f doc: 补全登记企业信息 2025-12-27 16:46:37 +08:00
click33
f6d6e50a16 docs: 补全企业登记案例 2025-12-26 12:26:46 +08:00
click33
fdead8cfa6 docs: 补全全局策略说明 2025-12-25 20:18:24 +08:00
click33
aa15d56082 docs: 优化文档排版 2025-12-25 01:37:41 +08:00
click33
30ffe1713f docs: 调整主题色块顺序,使之切换时对比更突出 2025-12-24 23:43:26 +08:00
click33
74db9e997e docs: 文档主题切换增加水滴特效 2025-12-24 23:31:40 +08:00
click33
f4fa77edd0 docs: 补全数据结构说明 2025-12-24 01:14:50 +08:00
click33
2cf899e019 docs: 增加 Same-Token 同源系统认证图示说明 2025-12-22 20:37:46 +08:00
click33
c625a29df8 docs: 子服务外网隔离章节增加示意图 2025-12-22 17:42:27 +08:00
click33
39b468b150 docs: 功能结构图增加点击事件跳转到对应功能文档 2025-12-01 01:00:17 +08:00
click33
a16552c3fe docs(sso): 单点登录消息推送模块增加 msgType 参数说明 2025-11-18 12:03:30 +08:00
click33
ed35640765 docs: 目录树增加专门栏目记录项目架构设计 2025-11-18 11:39:59 +08:00
click33
b85b2815ea docs: 添加 SSO 模块视频讲解链接 2025-11-12 15:53:22 +08:00
click33
5b8b99e0d0 feat(sso): 新增 sso-server 前后端分离模式下 平台中心模式 demo 示例 2025-11-11 14:51:38 +08:00
click33
75256e3329 docs: 修正部分信息 2025-11-10 22:55:42 +08:00
click33
43728fb6cc docs(sso): 补全 SSO 模块内置消息处理器相关文档 2025-10-23 18:41:40 +08:00
click33
a53874025e Merge branch 'dev' of https://gitee.com/dromara/sa-token into dev 2025-10-21 17:49:05 +08:00
click33
7a63be81d4 fix(docs): 修复不合适的文章标题 2025-10-21 17:47:52 +08:00
刘潇
4a16556a56 !352 update sa-token-doc/sso/sso-check-domain.md.
Merge pull request !352 from 吴金川/N/A
2025-10-10 05:52:14 +00:00
吴金川
5051f430c0 update sa-token-doc/sso/sso-check-domain.md.
Signed-off-by: 吴金川 <wujinchuan@126.com>
2025-10-10 01:38:49 +00:00
click33
fa76826ee0 docs: 修复文档不正确描述 2025-10-04 18:39:16 +08:00
click33
622cf3f3b5 docs(sso): 修复不正确的API说明 2025-09-20 13:33:48 +08:00
click33
0bebcd4b02 Merge branch 'dev' of https://gitee.com/dromara/sa-token into dev 2025-09-20 12:57:23 +08:00
click33
e1f25ccae8 docs: 更新赞助者名单 2025-09-20 12:54:38 +08:00
刘潇
ac6f06fb37 !348 refactor: sa-token-solon-plugin 优化 Gateway 接口的处理(避免使用路由接口)
Merge pull request !348 from 西东/dev
2025-09-04 06:26:37 +00:00
noear
4036788426 refactor: sa-token-solon-plugin 优化 Gateway 接口的处理(避免使用路由接口) 2025-07-29 11:19:25 +08:00
click33
b0d42821d7 docs: 完善文档 2025-06-07 11:59:57 +08:00
click33
ebc381772f release v1.44.0 .. 2025-06-07 01:22:29 +08:00
click33
d08f93bdc0 release v1.44.0 . 2025-06-07 01:08:39 +08:00
click33
c2fc4decef Merge branch 'dev' of https://gitee.com/dromara/sa-token into dev 2025-06-07 00:40:48 +08:00
刘潇
f7378f3898 !340 feat:新增 loveqq-framework 启动器集成
Merge pull request !340 from kfyty/dev
2025-06-06 16:40:30 +00:00
click33
7bde74bc51 release v1.44.0 2025-06-07 00:35:11 +08:00
kfyty725
5fc40a5af2 opt:loveqq-framework启动器支持java8 2025-06-04 21:31:41 +08:00
kfyty725
e13b263f27 feat:集成loveqq-framework示例 2025-06-04 17:48:49 +08:00
kfyty725
bd22a94a10 feat:集成loveqq-framework示例 2025-06-04 17:46:36 +08:00
kfyty725
be5ee2fc2b feat:loveqq-framework启动器 2025-06-04 16:12:23 +08:00
kfyty725
f4e7dac95f feat:loveqq-framework启动器 2025-06-04 15:20:00 +08:00
click33
e97cddb5e2 docs: 文档新增 sa-token-dubbo3 的说明 2025-06-04 00:16:39 +08:00
click33
e80369eb4b fix: 修复 sa-token-dubbo 与 sa-token-dubbo3 每次调用都强制需要上下文的问题。 2025-06-04 00:15:04 +08:00
click33
0cd3d66712 fix: sa-token-sso 模块 SaSsoClientModel 删除 isValidPushUrl 函数,避免其触发自动序列化操作导致无法存入 redis 2025-06-03 23:48:24 +08:00
click33
923b76a8db Merge branch 'dev' of https://gitee.com/dromara/sa-token into dev 2025-06-03 20:26:52 +08:00
click33
a6b38430cd fix: 修复 SSO 模式三全端注销失效的问题 2025-06-03 20:26:33 +08:00
刘潇
e2c08f7dd2 !339 feat: 支持重写获取高级权限与低级权限的方法
Merge pull request !339 from xiumu/dev
2025-06-03 10:17:53 +00:00
xiumu
986111b10c feat: 支持重写获取高级权限与低级权限的方法
- 将获取高级权限以及低级权限的方法放到SaOAuth2DataLoader中, 可以自定义权限数据的加载来源
2025-06-02 17:21:41 +08:00
click33
2cf18309b2 fix: 修复 sso-server 前后端分离示例无法正常登录的问题 2025-05-29 17:08:42 +08:00
click33
d22ac1b7cf docs: 更新赞助者名单 2025-05-27 12:14:33 +08:00
click33
fece7081a9 docs: 更新离线版文档下载链接地址 2025-05-23 06:36:34 +08:00
click33
dc874c2275 docs: 增加版本更新导读文章视频链接 2025-05-17 10:26:49 +08:00
181 changed files with 4862 additions and 1023 deletions

1
.gitignore vendored
View File

@@ -14,5 +14,6 @@ unpackage/
.idea/
sa-token-three-plugin/
sa-token-doc/big-file/
.flattened-pom.xml

View File

@@ -1,7 +1,7 @@
<p align="center">
<img alt="logo" src="https://sa-token.cc/logo.png" width="150" height="150">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.43.0</h1>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.44.0</h1>
<h4 align="center">开源、免费、轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h4>
<p align="center">
<a href="https://gitee.com/dromara/sa-token/stargazers"><img src="https://gitee.com/dromara/sa-token/badge/star.svg?theme=gvp"></a>
@@ -23,7 +23,7 @@
Sa-Token 是一个轻量级 Java 权限认证框架目前拥有五大核心模块登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。
![sa-token-jss](https://oss.dev33.cn/sa-token/doc/home/sa-token-jss--tran.png)
![sa-token-jss](https://sa-token.cc/big-file/index/intro/sa-token-jss--tran.png)
要在 SpringBoot 项目中使用 Sa-Token你只需要在 pom.xml 中引入依赖:
@@ -32,7 +32,7 @@ Sa-Token 是一个轻量级 Java 权限认证框架,目前拥有五大核心
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.43.0</version>
<version>1.44.0</version>
</dependency>
```
@@ -148,7 +148,7 @@ registry.addInterceptor(new SaInterceptor(handler -> {
Sa-Token SSO 分为三种模式解决同域、跨域、共享Redis、跨Redis、前后端一体、前后端分离……等不同架构下的 SSO 接入问题:
![sa-token-jss](https://oss.dev33.cn/sa-token/doc/home/sa-token-sso--white.png)
![sa-token-jss](https://sa-token.cc/big-file/doc/sso/sa-token-sso--white.png)
| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- |
@@ -225,7 +225,7 @@ QQ交流群823181187 [点击加入](https://qm.qq.com/q/EBIJVZBVGE)
<!-- <img src="https://oss.dev33.cn/sa-token/qr/wx-qr-m-400k.png" width="230px" title="微信群" /> -->
<img src="https://oss.dev33.cn/sa-token/qr/i-wx-qr2.png" width="230px" title="微信群" />
<img src="https://sa-token.cc/big-file/contact/i-wx-qr2.jpg" width="230px" title="微信群" />
(扫码添加微信备注sa-token邀您加入群聊)

View File

@@ -37,7 +37,7 @@
<!-- 一些属性 -->
<properties>
<revision>1.43.0</revision>
<revision>1.44.0</revision>
<jdk.version>1.8</jdk.version>
<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>

View File

@@ -13,7 +13,7 @@
<url>https://github.com/dromara/sa-token</url>
<properties>
<revision>1.43.0</revision>
<revision>1.44.0</revision>
</properties>
<dependencyManagement>

View File

@@ -25,7 +25,7 @@ import cn.dev33.satoken.context.model.SaTokenContextModelBox;
*
* <p>
* 使用 [ ThreadLocal 版本 ] 上下文处理器需要在全局过滤器或者拦截器内率先调用
* SaTokenContextForThreadLocalStorage.setBox(req, res, sto) 初始化上下文
* SaTokenContextForThreadLocalStaff.setBox(req, res, sto) 初始化上下文
* </p>
*
* <p> 一般情况下你不需要直接操作此类,因为框架的 starter 集成包里已经封装了完整的上下文操作 </p>

View File

@@ -36,7 +36,7 @@ public class SaTokenConsts {
/**
* Sa-Token 当前版本号
*/
public static final String VERSION_NO = "v1.43.0";
public static final String VERSION_NO = "v1.44.0";
/**
* Sa-Token 开源地址 Gitee

View File

@@ -57,8 +57,9 @@
<module>sa-token-demo-webflux-springboot3</module>
<module>sa-token-demo-websocket</module>
<module>sa-token-demo-websocket-spring</module>
<module>sa-token-demo-loveqq-boot</module>
</modules>
</modules>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -18,7 +18,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<java.run.main.class>com.pj.SaTokenAsyncApplication</java.run.main.class>
</properties>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>
@@ -73,7 +73,7 @@
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-bom</artifactId>
<version>1.43.0</version>
<version>1.44.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -18,7 +18,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<java.run.main.class>com.pj.SaTokenDeviceLockApplication</java.run.main.class>
</properties>

View File

@@ -17,7 +17,7 @@
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<dubbo.version>2.7.21</dubbo.version>
<nacos.version>1.4.2</nacos.version>
</properties>

View File

@@ -17,7 +17,7 @@
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<dubbo.version>2.7.21</dubbo.version>
<nacos.version>1.4.2</nacos.version>
</properties>

View File

@@ -18,7 +18,7 @@
<properties>
<java.version>17</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<dubbo.version>3.2.2</dubbo.version>
<nacos.version>2.2.2</nacos.version>
</properties>

View File

@@ -18,7 +18,7 @@
<properties>
<java.version>17</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<dubbo.version>3.2.2</dubbo.version>
<nacos.version>2.2.2</nacos.version>
</properties>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -27,7 +27,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.10</lombok.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-framework</artifactId>
<version>1.1.2</version>
<relativePath/>
</parent>
<artifactId>sa-token-demo-loveqq-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<jdk.version>17</jdk.version>
<java.version>17</java.version>
<maven.source.version>17</maven.source.version>
<maven.compile.version>17</maven.compile.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>
<!-- 引导启动模块 -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-boot</artifactId>
<version>${loveqq.framework.version}</version>
</dependency>
<!-- reactor-netty 服务器,同时支持命令式/响应式编程范式 -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-boot-starter-netty</artifactId>
<version>${loveqq.framework.version}</version>
</dependency>
<!-- sa-token 集成 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-loveqq-boot-starter</artifactId>
<version>${sa-token.version}</version>
</dependency>
<!-- logback 启动器 -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-boot-starter-logback</artifactId>
<version>${loveqq.framework.version}</version>
</dependency>
<!-- yaml 支持,默认使用 properties 文件,如果使用 yaml 需自行引入依赖 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,21 @@
package com.pj;
import cn.dev33.satoken.SaManager;
import com.kfyty.loveqq.framework.boot.K;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.BootApplication;
import com.kfyty.loveqq.framework.web.core.autoconfig.annotation.EnableWebMvc;
/**
* Sa-Token 整合 loveqq-framework 示例
*
* @author kfyty725
*/
@EnableWebMvc
@BootApplication
public class SaTokenLoveqqApplication {
public static void main(String[] args) {
K.run(SaTokenLoveqqApplication.class, args);
System.out.println("\n启动成功Sa-Token配置如下" + SaManager.getConfig());
}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pj.satoken;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
import cn.dev33.satoken.loveqq.boot.utils.SaTokenContextUtil;
import cn.dev33.satoken.stp.StpUtil;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Component;
import com.kfyty.loveqq.framework.web.core.filter.Filter;
import com.kfyty.loveqq.framework.web.core.filter.FilterChain;
import com.kfyty.loveqq.framework.web.core.http.ServerRequest;
import com.kfyty.loveqq.framework.web.core.http.ServerResponse;
/**
* 自定义过滤器
*/
@Component
public class MyFilter implements Filter {
/**
* 实现该方法,可以实现 servlet/reactor 的统一
* 但是该方法内部是同步方法,若需要异步,可以实现仅 reactor 支持的 {@link Filter#doFilter(ServerRequest, ServerResponse, FilterChain)} 方法
*
* @param request 请求
* @param response 响应
*/
@Override
public Continue doFilter(ServerRequest request, ServerResponse response) {
System.out.println("进入自定义过滤器");
// 先 set 上下文,再调用 Sa-Token 同步 API并在 finally 里清除上下文
SaTokenContextModelBox prev = SaTokenContextUtil.setContext(request, response);
try {
System.out.println(StpUtil.isLogin());
} finally {
SaTokenContextUtil.clearContext(prev);
}
return Continue.TRUE;
}
}

View File

@@ -0,0 +1,39 @@
package com.pj.satoken;
import cn.dev33.satoken.loveqq.boot.filter.SaRequestFilter;
import cn.dev33.satoken.util.SaResult;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Bean;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Configuration;
/**
* [Sa-Token 权限认证] 配置类
* @author click33
*
*/
@Configuration
public class SaTokenConfigure {
/**
* 注册 [sa-token全局过滤器]
*/
@Bean
public SaRequestFilter getSaReactorFilter() {
return new SaRequestFilter()
// 指定 [拦截路由]
.addInclude("/**")
// 指定 [放行路由]
.addExclude("/favicon.ico")
// 指定[认证函数]: 每次请求执行
.setAuth(r -> {
System.out.println("---------- sa全局认证");
// SaRouter.match("/test/test", () -> StpUtil.checkLogin());
})
// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
.setError(e -> {
System.out.println("---------- sa全局异常 ");
e.printStackTrace();
return SaResult.error(e.getMessage());
})
;
}
}

View File

@@ -0,0 +1,42 @@
package com.pj.satoken;
import cn.dev33.satoken.stp.StpInterface;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 自定义权限验证接口扩展
*/
@Component // 打开此注解保证此类被springboot扫描即可完成sa-token的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user-add");
list.add("user-delete");
list.add("user-update");
list.add("user-get");
list.add("article-get");
return list;
}
/**
* 返回一个账号所拥有的角色标识集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
// 本list仅做模拟实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;
}
}

View File

@@ -0,0 +1,18 @@
package com.pj.test;
import cn.dev33.satoken.util.SaResult;
import com.kfyty.loveqq.framework.web.core.annotation.ExceptionHandler;
import com.kfyty.loveqq.framework.web.core.annotation.RestControllerAdvice;
/**
* 全局异常处理
*/
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler
public SaResult handlerException(Exception e) {
e.printStackTrace();
return SaResult.error(e.getMessage());
}
}

View File

@@ -0,0 +1,116 @@
package com.pj.test;
import cn.dev33.satoken.loveqq.boot.context.SaReactorHolder;
import cn.dev33.satoken.loveqq.boot.utils.SaTokenContextUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Autowired;
import com.kfyty.loveqq.framework.web.core.annotation.GetMapping;
import com.kfyty.loveqq.framework.web.core.annotation.RequestMapping;
import com.kfyty.loveqq.framework.web.core.annotation.RestController;
import com.kfyty.loveqq.framework.web.core.annotation.bind.CookieValue;
import com.kfyty.loveqq.framework.web.core.annotation.bind.RequestParam;
import com.kfyty.loveqq.framework.web.core.http.ServerRequest;
import com.kfyty.loveqq.framework.web.core.http.ServerResponse;
import reactor.core.publisher.Mono;
import java.time.Duration;
/**
* 测试专用 Controller
* 本示例是基于 reactor 编写,如果是 servlet去除 SaReactorHolder/SaTokenContextUtil 包装,直接调用 sa-token api 即可
*
* @author click33
*/
@RestController
@RequestMapping("/test/")
public class TestController {
@Autowired
UserService userService;
// 登录测试Controller 里调用 Sa-Token API --- http://localhost:8081/test/login
@GetMapping("login")
public Mono<SaResult> login(@RequestParam(defaultValue = "10001") String id) {
return SaReactorHolder.sync(() -> {
StpUtil.login(id);
return SaResult.ok("登录成功");
});
}
// API测试手动设置上下文、try-finally 形式 --- http://localhost:8081/test/isLogin
@GetMapping("isLogin")
public SaResult isLogin(ServerRequest request, ServerResponse response) {
try {
SaTokenContextUtil.setContext(request, response);
System.out.println("是否登录:" + StpUtil.isLogin());
return SaResult.data(StpUtil.getTokenInfo());
} finally {
SaTokenContextUtil.clearContext(null);
}
}
// API测试手动设置上下文、lambda 表达式形式 --- http://localhost:8081/test/isLogin2
@GetMapping("isLogin2")
public SaResult isLogin2(ServerRequest request, ServerResponse response) {
SaResult res = SaTokenContextUtil.setContext(request, response, () -> {
System.out.println("是否登录:" + StpUtil.isLogin());
return SaResult.data(StpUtil.getTokenInfo());
});
return SaResult.data(res);
}
// API测试自动设置上下文、lambda 表达式形式 --- http://localhost:8081/test/isLogin3
@GetMapping("isLogin3")
public Mono<SaResult> isLogin3() {
return SaReactorHolder.sync(() -> {
System.out.println("是否登录:" + StpUtil.isLogin());
userService.isLogin();
return SaResult.data(StpUtil.getTokenInfo());
});
}
// API测试自动设置上下文、调用 userService Mono 方法 --- http://localhost:8081/test/isLogin4
@GetMapping("isLogin4")
public Mono<SaResult> isLogin4() {
return userService.findUserIdByNamePwd("ZhangSan", "123456")
.flatMap(userId -> SaReactorHolder.sync(() -> {
StpUtil.login(userId);
return SaResult.data(StpUtil.getTokenInfo());
}));
}
// API测试切换线程、复杂嵌套调用 --- http://localhost:8081/test/isLogin5
@GetMapping("isLogin5")
public Mono<SaResult> isLogin5() {
System.out.println("线程id-----" + Thread.currentThread().getId());
// 要点:在流里调用 Sa-Token API 之前,必须用 SaReactorHolder.sync( () -> {} ) 进行包裹
return Mono.delay(Duration.ofSeconds(1))
.doOnNext(r -> System.out.println("线程id-----" + Thread.currentThread().getId()))
.map(r -> SaReactorHolder.sync(() -> userService.isLogin()))
.map(r -> userService.findUserIdByNamePwd("ZhangSan", "123456"))
.map(r -> SaReactorHolder.sync(() -> userService.isLogin()))
.flatMap(isLogin -> {
System.out.println("是否登录 " + isLogin);
return SaReactorHolder.sync(() -> {
System.out.println("是否登录 " + StpUtil.isLogin());
return SaResult.data(StpUtil.getTokenInfo());
});
});
}
// API测试使用上下文无关的API --- http://localhost:8081/test/isLogin6
@GetMapping("isLogin6")
public SaResult isLogin6(@CookieValue("satoken") String satoken) {
System.out.println("token 为:" + satoken);
System.out.println("登录人:" + StpUtil.getLoginIdByToken(satoken));
return SaResult.ok("登录人:" + StpUtil.getLoginIdByToken(satoken));
}
// 测试 浏览器访问: http://localhost:8081/test/test
@GetMapping("test")
public SaResult test() {
System.out.println("线程id------- " + Thread.currentThread().getId());
return SaResult.ok();
}
}

View File

@@ -0,0 +1,24 @@
package com.pj.test;
import cn.dev33.satoken.stp.StpUtil;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Service;
import reactor.core.publisher.Mono;
/**
* 模拟 Service 方法
* @author click33
* @since 2025/4/6
*/
@Service
public class UserService {
public boolean isLogin() {
System.out.println("UserService 里调用 API 测试,是否登录:" + StpUtil.isLogin());
return StpUtil.isLogin();
}
public Mono<Long> findUserIdByNamePwd(String name, String pwd) {
// ...
return Mono.just(10001L);
}
}

View File

@@ -0,0 +1,4 @@
# 端口
k:
server:
port: 8081

View File

@@ -17,7 +17,7 @@
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<!-- 定义 Sa-Token 版本号 -->
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<!-- 定义 Sa-Token 版本号 -->
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
</parent>
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

View File

@@ -19,7 +19,7 @@
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.traget>17</maven.compiler.traget>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

View File

@@ -19,7 +19,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<java.run.main.class>com.pj.SaTokenApplication</java.run.main.class>
<java.version>1.8</java.version>
</properties>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<java.run.main.class>com.pj.SaTokenSseApplication</java.run.main.class>
</properties>

View File

@@ -27,7 +27,7 @@
<!--<spring.version>4.2.5.RELEASE</spring.version>-->
<spring.version>5.3.7</spring.version>
<jackson.version>2.16.1</jackson.version>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -0,0 +1,40 @@
// 服务端地址
var baseUrl = "http://sa-sso-server.com:9000";
// sa
var sa = {};
// 打开loading
sa.loading = function(msg) {
layer.closeAll(); // 开始前先把所有弹窗关了
return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load'});
};
// 隐藏loading
sa.hideLoading = function() {
layer.closeAll();
};
// 封装一下Ajax
sa.ajax = function(url, data, successFn) {
$.ajax({
url: baseUrl + url,
type: "post",
data: data,
dataType: 'json',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'satoken': localStorage.getItem('satoken')
},
success: function(res){
console.log('返回数据:', res);
successFn(res);
},
error: function(xhr, type, errorThrown){
if(xhr.status == 0){
return alert('无法连接到服务器,请检查网络');
}
return alert("异常:" + JSON.stringify(xhr));
}
});
}

View File

@@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SSO-Server 平台首页</title>
</head>
<body>
<h2>SSO-Server 平台首页 (前后端分离模式) (平台中心模式)</h2>
<p>
<a href='sso-auth.html?client=sso-client3&redirect=http://sa-sso-client1.com:9003/sso/login?back=http://sa-sso-client1.com:9003/'
target='_blank'> 进入Client1系统 </a>
</p>
<p>
<a href='sso-auth.html?client=sso-client3&redirect=http://sa-sso-client2.com:9003/sso/login?back=http://sa-sso-client2.com:9003/'
target='_blank'> 进入Client2系统 </a>
</p>
<p>
<a href='sso-auth.html?client=sso-client3&redirect=http://sa-sso-client3.com:9003/sso/login?back=http://sa-sso-client3.com:9003/'
target='_blank'> 进入Client3系统 </a>
</p>
<!-- scripts -->
<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
<script src="./common.js"></script>
<script>
sa.ajax("/sso/isLogin", {}, function(res) {
if(res.data) {
// 已登录...
console.log('已登录,开始操作...');
} else {
layer.msg('未登录,请先登录...')
setTimeout(function(){
location.href = './sso-auth.html';
}, 1000)
}
})
</script>
</body>
</html>

View File

@@ -4,7 +4,7 @@
<title>Sa-SSO-Server 认证中心-登录</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="./login.css">
<link rel="stylesheet" href="./sso-auth.css">
</head>
<body>
<div class="view-box">
@@ -35,9 +35,10 @@
</div>
<!-- scripts -->
<script src="https://unpkg.zhimg.com/jquery@3.4.1/dist/jquery.min.js"></script>
<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
<script src="./login.js"></script>
<script src="./common.js"></script>
<script src="./sso-auth.js"></script>
</body>
</html>

View File

@@ -1,43 +1,3 @@
// 服务端地址
var baseUrl = "http://sa-sso-server.com:9000";
// sa
var sa = {};
// 打开loading
sa.loading = function(msg) {
layer.closeAll(); // 开始前先把所有弹窗关了
return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load'});
};
// 隐藏loading
sa.hideLoading = function() {
layer.closeAll();
};
// 封装一下Ajax
sa.ajax = function(url, data, successFn) {
$.ajax({
url: baseUrl + url,
type: "post",
data: data,
dataType: 'json',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'satoken': localStorage.getItem('satoken')
},
success: function(res){
console.log('返回数据:', res);
successFn(res);
},
error: function(xhr, type, errorThrown){
if(xhr.status == 0){
return alert('无法连接到服务器,请检查网络');
}
return alert("异常:" + JSON.stringify(xhr));
}
});
}
// ----------------------------------- 相关事件 -----------------------------------
@@ -47,16 +7,29 @@ var pData = {
redirect: getParam('redirect', ''),
mode: getParam('mode', '')
};
sa.ajax("/sso/getRedirectUrl", pData, function(res) {
if(res.code == 200) {
// 已登录并且redirect地址有效开始跳转
location.href = res.data;
} else if(res.code == 401) {
console.log('未登录');
} else {
layer.alert(res.msg);
}
})
// 提供 redirect 参数时,登录后往 redirect 跳转
if(pData.redirect) {
sa.ajax("/sso/getRedirectUrl", pData, function(res) {
if(res.code == 200) {
// 已登录并且redirect地址有效开始跳转
location.href = res.data;
} else if(res.code == 401) {
console.log('未登录');
} else {
layer.alert(res.msg);
}
})
} else {
// 未提供 redirect 参数时,登录后往 home 跳转
sa.ajax("/sso/isLogin", {}, function(res) {
if(res.data) {
location.href = './home.html';
} else {
console.log('未登录,请先登录...');
}
})
}
// 登录
$('.login-btn').click(function(){

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,15 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
public class H5Controller {
/**
* 返回当前是否已经登录
*/
@RequestMapping("/sso/isLogin")
public SaResult isLogin() {
return SaResult.data(StpUtil.isLogin());
}
/**
* 获取 redirectUrl
*/
@@ -34,7 +42,7 @@ public class H5Controller {
return SaResult.data(redirect);
} else {
// 模式二或模式三
String redirectUrl = SaSsoServerUtil.buildRedirectUrl(client, redirect, StpUtil.getLoginId(), StpUtil.getLoginDeviceId());
String redirectUrl = SaSsoServerUtil.buildRedirectUrl(client, redirect, StpUtil.getLoginId(), StpUtil.getTokenValue());
return SaResult.data(redirectUrl);
}
}

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -18,7 +18,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
<java.run.main.class>com.pj.SaTokenApplication</java.run.main.class>
</properties>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -16,7 +16,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -17,7 +17,7 @@
<!-- 定义 Sa-Token 版本号 -->
<properties>
<sa-token.version>1.43.0</sa-token.version>
<sa-token.version>1.44.0</sa-token.version>
</properties>
<dependencies>

View File

@@ -12,7 +12,7 @@
<description>Sa-Token Dependencies</description>
<properties>
<revision>1.43.0</revision>
<revision>1.44.0</revision>
<!-- 统一定义依赖版本号 -->
<springboot.version>2.7.18</springboot.version>
@@ -30,6 +30,7 @@
<noear-snack3.version>3.2.133</noear-snack3.version>
<jfinal.version>4.9.17</jfinal.version>
<jboot.version>3.14.4</jboot.version>
<loveqq.version>1.1.2-java8</loveqq.version>
<commons-pool2.version>2.5.0</commons-pool2.version>
<dubbo.version>2.7.21</dubbo.version>
<grpc-spring-boot-starter.version>2.10.1.RELEASE</grpc-spring-boot-starter.version>
@@ -124,6 +125,27 @@
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<!-- loveqq-core -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-core</artifactId>
<version>${loveqq.version}</version>
</dependency>
<!-- loveqq-mvc-core -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-mvc-core</artifactId>
<version>${loveqq.version}</version>
</dependency>
<!-- loveqq redisson starter -->
<dependency>
<groupId>com.kfyty</groupId>
<artifactId>loveqq-boot-starter-redisson</artifactId>
<version>${loveqq.version}</version>
</dependency>
<!-- test -->
<!-- <dependency>

View File

@@ -1,7 +1,7 @@
<p align="center">
<img alt="logo" src="https://sa-token.cc/logo.png" width="150" height="150">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.43.0</h1>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.44.0</h1>
<h5 align="center">开源、免费、轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h5>
<p align="center" class="badge-box">
<a href="https://gitee.com/dromara/sa-token/stargazers"><img src="https://gitee.com/dromara/sa-token/badge/star.svg?theme=gvp"></a>
@@ -28,7 +28,9 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权**
等一系列权限相关问题。
![sa-token-jss](https://oss.dev33.cn/sa-token/doc/home/sa-token-jss--tran.png)
<!-- ![sa-token-jss](/big-file/index/intro/sa-token-jss--tran.png) -->
<object class="sa-token-jss-img" data="/big-file/index/intro/sa-token-jss--tran--onclick.svg"></object>
Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
@@ -127,7 +129,7 @@ Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点
功能结构图:
![sa-token-js](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/x/sa-token-js4.png 's-w')
<img class="s-w" src="/big-file/index/intro/sa-token-js4.png" />
## 开源仓库 Star 趋势

View File

@@ -55,7 +55,7 @@
- [NoSdk、ReSdk 模式与非 java 项目](/sso/sso-nosdk)
- [SSO 代码 API 参考](/sso/sso-dev)
- [常见问题总结](/sso/sso-questions)
- [Sa-Sso-Pro单点登录商业版](/sso/sso-pro)
- [Sa-Pro单点登录商业版](/pro/st_sso)
- **OAuth2.0**
- [OAuth2.0简述](/oauth2/readme)
@@ -75,6 +75,7 @@
- [OAuth2-与登录会话实现数据互通](/oauth2/oauth2-interworking)
- [OAuth2 代码 API 参考](/oauth2/oauth2-dev)
- [常见问题总结](/oauth2/oauth2-questions)
- [Sa-Max统一认证商业版](/pro/st_oauth2)
<!-- - [前后端分离模式整合方案](/oauth2/4) -->
<!-- - [平台中心模式开发](/oauth2/5) -->
<!-- - [jwt 风格 token](/oauth2/6) -->
@@ -103,6 +104,7 @@
- [Sa-Token 插件开发指南](/fun/plugin-dev)
- [自定义 SaTokenContext 指南](/fun/sa-token-context)
- **API手册**
- [StpUtil-鉴权工具类](/api/stp-util)
- [SaSession-会话对象](/api/sa-session)
@@ -111,6 +113,11 @@
- [全局类、方法](/more/common-action)
- **框架设计**
- [仓库目录](/arch/dir-intro)
- [数据结构](/arch/data-structure)
- **其它**
- [更新日志](/more/update-log)
- [框架生态](/more/link)
@@ -133,7 +140,6 @@
- [数据读写三大作用域](/fun/three-scope)
- [TokenInfo参数详解](/fun/token-info)
- [异常细分状态码](/fun/exception-code)
- [数据结构](/fun/data-structure)
- [自定义注解](/fun/custom-annotations)
- [防火墙](/fun/firewall)
- [参考:把权限放在缓存里](/fun/jur-cache)

View File

@@ -4,7 +4,7 @@ SaStrategy-全局策略,核心逻辑的代理封装。
---
### 所有策略
### 核心策略
``` java
/**
@@ -24,6 +24,11 @@ public Function<String, SaSession> createSession = (sessionId) -> {
return new SaSession(sessionId);
};
/**
* 反序列化 SaSession 时默认指定的类型
*/
public Class<? extends SaSession> sessionClassType = SaSession.class;
/**
* 判断:集合中是否包含指定元素(模糊匹配)
* <p> 参数 [集合, 元素]
@@ -32,38 +37,14 @@ public BiFunction<List<String>, String, Boolean> hasElement = (list, element) ->
return false;
};
/**
* 对一个 [Method] 对象进行注解校验 (注解鉴权内部实现)
* <p> 参数 [Method句柄]
*/
public Consumer<Method> checkMethodAnnotation = (method) -> {
// ...
};
/**
* 对一个 [元素] 对象进行注解校验 (注解鉴权内部实现)
* <p> 参数 [element元素]
* 生成唯一式 token 的算法
* <p> 参数:元素名称, 最大尝试次数, 创建 token 函数, 检查 token 函数 </p>
*/
public Consumer<AnnotatedElement> checkElementAnnotation = (target) -> {
// ...
};
/**
* 从元素上获取注解(注解鉴权内部实现)
* <p> 参数 [element元素要获取的注解类型]
*/
public BiFunction<AnnotatedElement, Class<? extends Annotation> , Annotation> getAnnotation = (element, annotationClass)->{
// 默认使用jdk的注解处理器
return element.getAnnotation(annotationClass);
};
/**
* 拼接两个url
* <p> 例如url1=http://domain.cnurl2=/sso/auth则返回http://domain.cn/sso/auth
* <p> 参数 [第一个url, 第二个url]
*/
public BiFunction<String, String, String> spliceTwoUrl = (url1, url2) -> {
return xxx;
public SaGenerateUniqueTokenFunction generateUniqueToken = (elementName, maxTryTimes, createTokenFunction, checkTokenFunction) -> {
// ...
return "xxxxxx";
};
/**
@@ -74,10 +55,105 @@ public BiFunction<String, String, String> spliceTwoUrl = (url1, url2) -> {
public Function<StpLogic, Boolean> autoRenew = (stpLogic) -> {
return stpLogic.getConfigOrGlobal().getAutoRenew();
};
/**
* 创建 StpLogic 的算法
* <p> 参数:账号体系标识 </p>
* <p> 返回:创建好的 StpLogic 对象 </p>
*/
public SaCreateStpLogicFunction createStpLogic = (loginType) -> {
return new StpLogic(loginType);
};
/**
* 路由匹配策略
* <p> 参数pattern, path </p>
* <p> 返回:是否匹配 </p>
*/
public SaRouteMatchFunction routeMatcher = (pattern, path) -> {
return true;
};
/**
* CORS 策略处理函数
* <p> 参数:请求包装对象, 响应包装对象, 数据读写对象 </p>
*/
public SaCorsHandleFunction corsHandle = (req, res, sto) -> {
};
```
### 注解操作相关策略
``` java
/**
* 对一个 [Method] 对象进行注解校验 (注解鉴权内部实现)
* <p> 参数Method句柄 </p>
* <p> 返回:无 </p>
*/
public SaCheckMethodAnnotationFunction checkMethodAnnotation = (method) -> {
// ...
};
/**
* 对一个 [Element] 对象进行注解校验 (注解鉴权内部实现)
* <p> 参数element元素 </p>
* <p> 返回:无 </p>
*/
@SuppressWarnings("unchecked")
public SaCheckElementAnnotationFunction checkElementAnnotation = (element) -> {
// ...
};
/**
* 从元素上获取注解
* <p> 参数element元素要获取的注解类型 </p>
* <p> 返回:注解对象 </p>
*/
public SaGetAnnotationFunction getAnnotation = (element, annotationClass)->{
return element.getAnnotation(annotationClass);
};
/**
* 判断一个 Method 或其所属 Class 是否包含指定注解
* <p> 参数Method、注解 </p>
* <p> 返回:是否包含 </p>
*/
public SaIsAnnotationPresentFunction isAnnotationPresent = (method, annotationClass) -> {
// ...
return false;
};
/**
* SaCheckELRootMap 扩展函数
* <p> 参数SaCheckELRootMap 对象 </p>
*/
public SaCheckELRootMapExtendFunction checkELRootMapExtendFunction = rootMap -> {
// 默认不做任何处理
};
```
### 防火墙相关策略
``` java
/**
* 防火墙校验函数
* <p> 参数:请求对象、响应对象、预留扩展参数 </p>
*/
public SaFirewallCheckFunction check = (req, res, extArg) -> {
// ...
};
/**
* 自定义当请求 path 校验不通过时地处理方案
* <p> 参数:防火墙校验异常、请求对象、响应对象、预留扩展参数 </p>
*/
SaFirewallStrategy.instance.checkFailHandle = (e, req, res, extArg) -> {
// 自定义处理逻辑 ...
};
```
参考:[防火墙](/fun/firewall)

View File

@@ -6,24 +6,20 @@
### 1.1、token -> loginId 映射
``` js
{tokenName}:{loginType}:token:{tokenValue}
// ttl = 此 token 的 timeout 有效期
{tokenName}:{loginType}:token:{tokenValue} --> {loginId}
```
<details>
<summary>详细</summary>
key 示例 ttl 为 timeout 有效期值
示例:
``` js
satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8
```
正常 value 格式
``` js
10001 loginId登录id一般为账号id
satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8 --> 10001
```
异常 value 格式
``` js
-1 未能从请求中读取到有效 token
-2 已读取到 token但是 token 无效
@@ -40,28 +36,27 @@ satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8
### 1.2、active-timeout
``` js
{tokenName}:{loginType}:last-active:{tokenValue}
// ttl = 对应 token 的 timeout 有效期值
{tokenName}:{loginType}:last-active:{tokenValue} --> {13位时间戳}
```
<details>
<summary>详细</summary>
key 示例 key 的 ttl 为 timeout 有效期值
示例:
``` js
satoken:login:last-active:06d1f12b-614e-4c00-8d8e-c07fef5f4aa9
satoken:login:last-active:06d1f12b-614e-4c00-8d8e-c07fef5f4aa9 --> 1722334954193
```
value 格式
value 格式分两种:
```
1722334954193 // 单值时:此 token 最后访问日期
1722334954193, 1200 // 双值时:此 token 最后访问日期,此 token 指定的动态 active-timeout 值
```
active-timeout 判断方式
注意:判断一个 token 是否 active-timeout 过期,与 ttl 无关,而是利 value 值计算
``` js
当前时间 - token 最后访问时间 > active-timeout
返回 true 此 token 已冻结
返回 false此 token 未冻结
当前时间 - token 最后访问时间 > active-timeout true=token 已冻结false=token 未冻结
```
</details>
@@ -71,9 +66,9 @@ active-timeout 判断方式:
### 1.3、SaSession
``` js
{tokenName}:{loginType}:session:{loginId} // Account-Session
{tokenName}:{loginType}:token-session:{loginId} // Token-Session
{tokenName}:custom:session:{sessionId} // Custom-Session
{tokenName}:{loginType}:session:{loginId} --> {SaSession 对象} // Account-Session
{tokenName}:{loginType}:token-session:{loginId} --> {SaSession 对象} // Token-Session
{tokenName}:custom:session:{sessionId} --> {SaSession 对象} // Custom-Session
```
<details>
@@ -139,14 +134,14 @@ value 格式
### 1.4、二级认证
``` js
{tokenName}:{loginType}:safe:{service}:{tokenValue}
{tokenName}:{loginType}:safe:{service}:{tokenValue} --> SAFE_AUTH_SAVE_VALUE
```
value 为常亮值:`SAFE_AUTH_SAVE_VALUE`
### 1.5、账号服务封禁
``` js
{tokenName}:{loginType}:disable:{service}:{loginId}
{tokenName}:{loginType}:disable:{service}:{loginId} --> {level}
```
value 为封禁等级int类型
@@ -157,19 +152,19 @@ SaApplication 全局变量
{tokenName}:var:{变量名}
```
本次请求新创建 token存储 key
本次请求新创建 token在 SaStorage 存储 key
``` js
JUST_CREATED_
JUST_CREATED_ --> {token}
```
本次请求新创建 token存储 key (无前缀方式)
本次请求新创建 token在 SaStorage 存储 key (无前缀方式)
``` js
JUST_CREATED_NOT_PREFIX_
JUST_CREATED_NOT_PREFIX_ --> {token}
```
临时身份切换使用的key
``` js
SWITCH_TO_SAVE_KEY_{loginType}
SWITCH_TO_SAVE_KEY_{loginType} --> {loginId}
```
@@ -177,23 +172,19 @@ SWITCH_TO_SAVE_KEY_{loginType}
### 2.1、ticket -> loginId 映射
``` js
{tokenName}:ticket:{ticket}
// ttl = 此 ticket 有效期,下同理
{tokenName}:ticket:{ticket} --> {loginId}
```
值为 loginId
### 2.2、ticket -> client 映射
``` js
{tokenName}:ticket-client:{ticket}
{tokenName}:ticket-client:{ticket} --> {client}
```
值为 client
### 2.3、loginId -> ticket 映射loginId 反查 ticket
### 2.3、loginId -> ticket 映射client + loginId 反查 ticket
``` js
{tokenName}:id-ticket:{id}
{tokenName}:ticket-index:{client}:{loginId} --> {ticket}
```
值为 ticket
@@ -201,21 +192,21 @@ SWITCH_TO_SAVE_KEY_{loginType}
### 3.1、Code 授权码
``` js
{tokenName}:oauth2:code:{code}
{tokenName}:oauth2:code:{code} --> {CodeModel 对象}
```
<details>
<summary>详细</summary>
值为 CodeModel
value 示例:
``` js
{
"@class": "cn.dev33.satoken.oauth2.model.CodeModel", // java class 信息
"code": "AbRVp2HrgyklE0BXYWszskGJWAGY7xhGu6Zaco4zJECzGYagCCFWj0jOlHza", // code值
"scope": "", // 所申请权限列表,多个用逗号隔开
"loginId": "10001", // 对应的loginId
"redirectUri": "", // 重定向地址
"@class": "cn.dev33.satoken.oauth2.model.CodeModel", // java class 信息
"code": "AbRVp2HrgyklE0BXYWszskGJWAGY7xhGu6Zaco4zJECzGYagCCFWj0jOlHza", // code值
"scope": "", // 所申请权限列表,多个用逗号隔开
"loginId": "10001", // 对应的loginId
"redirectUri": "", // 重定向地址
}
```
@@ -223,20 +214,20 @@ SWITCH_TO_SAVE_KEY_{loginType}
clientId + loginId 反查 code
``` js
{tokenName}:oauth2:code-index:{clientId}:{loginId}
{tokenName}:oauth2:code-index:{clientId}:{loginId} --> {code 值}
```
### 3.2、Access-Token 资源令牌
``` js
{tokenName}:oauth2:access-token:{accessToken}
{tokenName}:oauth2:access-token:{accessToken} --> {AccessTokenModel 对象}
```
<details>
<summary>详细</summary>
值为 AccessTokenModel
value 示例:
``` js
{
@@ -277,19 +268,19 @@ clientId + loginId 反查 code
clientId + loginId 反查 Access-Token
``` js
{tokenName}:oauth2:access-token-index:{clientId}:{loginId}
{tokenName}:oauth2:access-token-index:{clientId}:{loginId} --> {access_token 值}
```
### 3.3、Refresh-Token 资源令牌
``` js
{tokenName}:oauth2:refresh-token:{refreshToken}
{tokenName}:oauth2:refresh-token:{refreshToken} --> {RefreshTokenModel 对象}
```
<details>
<summary>详细</summary>
值为 RefreshTokenModel
value 示例:
``` js
{
@@ -324,19 +315,19 @@ clientId + loginId 反查 Access-Token
clientId + loginId 反查 Refresh-Token
``` js
{tokenName}:oauth2:refresh-token-index:{clientId}:{loginId}
{tokenName}:oauth2:refresh-token-index:{clientId}:{loginId} --> {refresh_token 值}
```
### 3.4、Client-Token 应用令牌
``` js
{tokenName}:oauth2:client-token:{clientToken}
{tokenName}:oauth2:client-token:{clientToken} --> {ClientTokenModel 对象}
```
<details>
<summary>详细</summary>
值为 ClientTokenModel
value 示例:
``` js
{
@@ -368,19 +359,19 @@ clientId + loginId 反查 Refresh-Token
clientId 反查 Client-Token
``` js
{tokenName}:oauth2:client-token-index:{clientId}
{tokenName}:oauth2:client-token-index:{clientId} --> {client_token 值}
```
Lower-Client-Token 次级应用令牌索引
``` js
{tokenName}:oauth2:lower-client-token-index:{clientId}
{tokenName}:oauth2:lower-client-token-index:{clientId} --> {client_token 值}
```
### 3.5、用户授权记录
``` js
{tokenName}:oauth2:grant-scope:{clientId}:{loginId}
{tokenName}:oauth2:grant-scope:{clientId}:{loginId} --> {scope列表}
```
值为 scope 列表,多个用逗号隔开
值为 scope 列表,多个用逗号隔开,例如:`userinfo,openid,userid`
@@ -388,21 +379,35 @@ Lower-Client-Token 次级应用令牌索引
## 4、插件
### 4.1、临时 token 会话
temp-token -> value
``` js
{tokenName}:temp-token:{service}:{token}
// namespace 默认值为 "temp-token"
{tokenName}:{namespace}:{temp-token} --> {value}
```
value 反查 temp-token
``` js
{tokenName}:raw-session:{namespace}:{value} --> {Raw#SaSession 对象}
```
- 在 SaSession 以 `__HD_TEMP_TOKEN_MAP` 为 key 存储 temp-token 索引列表。值类型为 Map。
- 其中Map 的 key = temp-token 值Map 的 value = 此 temp-token 到期时间戳。
### 4.2、 Same-Token
Same-Token
``` js
{tokenName}:var:same-token
{tokenName}:var:same-token --> {same-token 值}
```
Past-Same-Token
``` js
{tokenName}:var:past-same-token
{tokenName}:var:past-same-token --> {same-token 值}
```
@@ -410,9 +415,59 @@ Past-Same-Token
随机字符串
``` js
{tokenName}:sign:nonce:{32位随机字符}
// nonce 值 默认为 32位随机字符
{tokenName}:sign:nonce:{nonce} --> {nonce 值}
```
### 4.4、API Key
``` js
// namespace 默认值为 "apikey" (全小写), ttl = 此 API Key 剩余有效期
{tokenName}:{namespace}:{apikey} --> {ApiKeyModel 对象}
```
<details>
<summary>详细</summary>
key 示例:
``` js
satoken:apikey:AK-XCoJLP2E7Q9GXyPiiZWMM8Sqi6Fm0JoFC41R
```
value 示例:
``` js
{
"@class": "cn.dev33.satoken.apikey.model.ApiKeyModel", // java class 信息
"title": "test", // API Key 名称
"intro": null, // 用途介绍
"apiKey": "AK-XCoJLP2E7Q9GXyPiiZWMM8Sqi6Fm0JoFC41R", // API Key 值
"loginId": "10001", // 所属用户 id
"createTime": 1766509019137, // 创建时间戳
"expiresTime": 1769101019136, // 到期时间戳
"isValid": true, // 是否有效
"scopes": [ // 含有权限
"java.util.ArrayList",
[
"userinfo",
"user-update"
]
],
"extraData": null // 扩展数据Map<String, Object> 类型
}
```
</details>
value 反查 API Key
``` js
{tokenName}:raw-session:{namespace}:{value} --> {Raw#SaSession 对象}
```
- 在 SaSession 以 `__HD_API_KEY_LIST` 为 key 存储 API Key 索引列表。值类型为 List (API Key 列表)。

View File

@@ -0,0 +1,157 @@
# 仓库目录介绍
---
### 1、仓库根目录介绍
``` js
── sa-token
├── sa-token-core // [核心] Sa-Token 核心模块
├── sa-token-dependencies // [依赖] Sa-Token 依赖版本信息
├── sa-token-bom // [核心] Sa-Token bom 包
├── sa-token-starter // [整合] Sa-Token 与其它框架整合
├── sa-token-plugin // [插件] Sa-Token 插件合集
├── sa-token-demo // [示例] Sa-Token 示例合集
├── sa-token-test // [测试] Sa-Token 单元测试合集
├── sa-token-doc // [文档] Sa-Token 开发文档
├── pom.xml // [依赖] 顶级pom文件
├── LICENSE // 开源协议
├── mvn clean.bat // 一键 mvn clean 核心包+所有示例包
├── mvn test.bat // 一键单元测试
├── preview-doc.bat // 一键预览开发文档
├── README.md // 仓库自述文件
```
### 2、所有目录详细介绍
``` js
── sa-token
├── sa-token-core // [核心] Sa-Token 核心模块
├── sa-token-dependencies // [依赖] Sa-Token 依赖版本信息
├── sa-token-bom // [核心] Sa-Token bom 包
├── sa-token-starter // [整合] Sa-Token 与其它框架整合
├── sa-token-servlet // [整合] Sa-Token 整合 Servlet 容器实现类包
├── sa-token-spring-boot-starter // [整合] Sa-Token 整合 SpringBoot2 快速集成
├── sa-token-reactor-spring-boot-starter // [整合] Sa-Token 整合 SpringBoot2 Reactor 响应式编程 快速集成
├── sa-token-jakarta-servlet // [整合] Sa-Token 整合 Jakarta-Servlet 容器实现类包
├── sa-token-spring-boot3-starter // [整合] Sa-Token 整合 SpringBoot3 快速集成
├── sa-token-reactor-spring-boot3-starter // [整合] Sa-Token 整合 SpringBoot3 Reactor 响应式编程 快速集成
├── sa-token-spring-boot-autoconfig // [整合] Sa-Token 整合 SpringBoot 自动配置包
├── sa-token-solon-plugin // [整合] Sa-Token 整合 Solon 快速集成
├── sa-token-jfinal-plugin // [整合] Sa-Token 整合 JFinal 快速集成
├── sa-token-jboot-plugin // [整合] Sa-Token 整合 jboot 快速集成
├── sa-token-plugin // [插件] Sa-Token 插件合集
├── sa-token-jackson // [插件] Sa-Token 整合 Jackson (json序列化插件)
├── sa-token-fastjson // [插件] Sa-Token 整合 Fastjson (json序列化插件)
├── sa-token-fastjson2 // [插件] Sa-Token 整合 Fastjson (json序列化插件)
├── sa-token-snack3 // [插件] Sa-Token 整合 Snack3 (json序列化插件)
├── sa-token-hutool-timed-cache // [插件] Sa-Token 整合 Hutool 缓存组件 Timed-Cache基于内存 (数据缓存插件)
├── sa-token-caffeine // [插件] Sa-Token 整合 Caffeine 缓存组件(基于内存) (数据缓存插件)
├── sa-token-thymeleaf // [插件] Sa-Token 整合 Thymeleaf (自定义标签方言)
├── sa-token-freemarker // [插件] Sa-Token 整合 Freemarker (自定义标签方言)
├── sa-token-dubbo // [插件] Sa-Token 整合 Dubbo (RPC 调用鉴权、状态传递)
├── sa-token-dubbo3 // [插件] Sa-Token 整合 Dubbo3 (RPC 调用鉴权、状态传递)
├── sa-token-temp-jwt // [插件] Sa-Token 整合 jjwt (临时 Token)
├── sa-token-sso // [插件] Sa-Token 实现 SSO 单点登录
├── sa-token-oauth2 // [插件] Sa-Token 实现 OAuth2.0 认证
├── sa-token-apikey // [插件] Sa-Token 实现 API Key 认证
├── sa-token-sign // [插件] Sa-Token 实现 API 参数签名
├── sa-token-redisson // [插件] Sa-Token 整合 Redisson (数据缓存插件)
├── sa-token-redisx // [插件] Sa-Token 整合 Redisx (数据缓存插件)
├── sa-token-serializer-features // [插件] Sa-Token 序列化实现扩展
├── sa-token-redis-template // [插件] Sa-Token 整合 RedisTemplate (数据缓存插件)
├── sa-token-redis-template-jdk-serializer // [插件] Sa-Token 整合 RedisTemplate - 使用 jdk 序列化算法 (数据缓存插件)
├── sa-token-redis-jackson // [插件] Sa-Token 整合 RedisTemplate - 使用 Jackson 序列化算法 (数据缓存插件)
├── sa-token-alone-redis // [插件] Sa-Token 独立 Redis 插件,实现 [ 权限缓存与业务缓存分离 ]
├── sa-token-spring-aop // [插件] Sa-Token 整合 SpringAOP 注解鉴权
├── sa-token-spring-el // [插件] Sa-Token 实现 SpringEL 表达式注解鉴权
├── sa-token-grpc // [插件] Sa-Token 整合 gRPC (RPC 调用鉴权、状态传递)
├── sa-token-quick-login // [插件] Sa-Token 快速注入登录页插件
├── sa-token-redisson-spring-boot-starter // [插件] Sa-Token 整合 Redisson - SpringBoot 自动配置包 (数据缓存插件)
├── sa-token-forest // [插件] Sa-Token 整合 Foresthttp 请求处理器
├── sa-token-okhttps // [插件] Sa-Token 整合 OkHttpshttp 请求处理器
├── sa-token-demo // [示例] Sa-Token 示例合集
├── sa-token-demo-alone-redis // [示例] Sa-Token 集成 alone-redis 模块
├── sa-token-demo-alone-redis-cluster // [示例] Sa-Token 集成 alone-redis 模块、集群模式
├── sa-token-demo-apikey // [示例] Sa-Token API Key 模块示例
├── sa-token-demo-async // [示例] Sa-Token 异步场景示例
├── sa-token-demo-beetl // [示例] Sa-Token 集成 beetl 示例
├── sa-token-demo-bom-import // [示例] Sa-Token bom 包导入示例
├── sa-token-demo-case // [示例] Sa-Token 各模块示例
├── sa-token-demo-device-lock // [示例] Sa-Token 设备锁登录示例 - 后端
├── sa-token-demo-device-lock-h5 // [示例] Sa-Token 设备锁登录示例 - 前端
├── sa-token-demo-dubbo // [示例] Sa-Token 集成 dubbo
├── sa-token-demo-dubbo-consumer // [示例] Sa-Token 集成 dubbo 鉴权,消费端(调用端)
├── sa-token-demo-dubbo-provider // [示例] Sa-Token 集成 dubbo 鉴权,生产端(被调用端)
├── sa-token-demo-dubbo3-consumer // [示例] Sa-Token 集成 dubbo3 鉴权,消费端(调用端)
├── sa-token-demo-dubbo3-provider // [示例] Sa-Token 集成 dubbo3 鉴权,生产端(被调用端)
├── sa-token-demo-freemarker // [示例] Sa-Token 集成 Freemarker 标签方言
├── sa-token-demo-grpc // [示例] Sa-Token 集成 grpc 鉴权
├── client // [示例] Sa-Token 集成 grpc 鉴权client 端
├── server // [示例] Sa-Token 集成 grpc 鉴权server 端
├── sa-token-demo-hutool-timed-cache // [示例] Sa-Token 集成 hutool timed-cache
├── sa-token-demo-caffeine // [示例] Sa-Token 集成 Caffeine
├── sa-token-demo-jwt // [示例] Sa-Token 集成 jwt 登录认证
├── sa-token-demo-oauth2 // [示例] Sa-Token 集成 OAuth2.0
├── sa-token-demo-oauth2-client // [示例] Sa-Token 集成 OAuth2.0 (客户端)
├── sa-token-demo-oauth2-client-h5 // [示例] Sa-Token OAuth2 前端测试页
├── sa-token-demo-oauth2-server // [示例] Sa-Token 集成 OAuth2.0 (服务端)
├── sa-token-demo-oauth2-server-h5 // [示例] Sa-Token 集成 OAuth2.0 (服务端 - 前后台分离示例)
├── sa-token-demo-quick-login // [示例] Sa-Token 集成 quick-login 模块
├── sa-token-demo-quick-login-sb3 // [示例] Sa-Token 集成 quick-login 模块 (SpringBoot3)
├── sa-token-demo-remember-me // [示例] Sa-Token 实现 [ 记住我 ] 模式
├── page_project // [示例] Sa-Token 实现 [ 记住我 ] 模式、前端页面
├── sa-token-demo-remember-me-server // [示例] Sa-Token 实现 [ 记住我 ] 模式、后端接口
├── sa-token-demo-solon // [示例] Sa-Token 集成 Solon
├── sa-token-demo-solon-reisson // [示例] Sa-Token 集成 Solon、Reisson
├── sa-token-demo-springboot // [示例] Sa-Token 整合 SpringBoot
├── sa-token-demo-springboot3-redis // [示例] Sa-Token 整合 SpringBoot3 整合 Redis
├── sa-token-demo-springboot-low-version // [示例] Sa-Token 整合 SpringBoot2 低版本
├── sa-token-demo-springboot-redis // [示例] Sa-Token 整合 SpringBoot 整合 Redis
├── sa-token-demo-springboot-redisson // [示例] Sa-Token 整合 SpringBoot 整合 redisson
├── sa-token-demo-sse // [示例] 在 SSE 中使用 Sa-Token
├── sa-token-demo-ssm // [示例] 在 SSM 中使用 Sa-Token
├── sa-token-demo-sso // [示例] Sa-Token 集成 SSO 单点登录
├── sa-token-demo-sso-server // [示例] Sa-Token 集成 SSO单点登录-Server认证中心
├── sa-token-demo-sso1-client // [示例] Sa-Token 集成 SSO单点登录-模式一 应用端 (同域、同Redis)
├── sa-token-demo-sso2-client // [示例] Sa-Token 集成 SSO单点登录-模式二 应用端 (跨域、同Redis)
├── sa-token-demo-sso3-client // [示例] Sa-Token 集成 SSO单点登录-模式三 应用端 (跨域、跨Redis)
├── sa-token-demo-sso3-client-nosdk // [示例] Sa-Token 集成 SSO单点登录-模式三 应用端 (不使用sdk纯手动对接)
├── sa-token-demo-sso3-client-resdk // [示例] Sa-Token 集成 SSO单点登录-模式三 应用端 (ReSdk 模式,重写部分方法对接任意技术栈)
├── sa-token-demo-sso3-client-anon // [示例] Sa-Token 集成 SSO单点登录-模式三 应用端 (匿名应用接入示例)
├── sa-token-demo-sso-server-h5 // [示例] Sa-Token 集成 SSO单点登录-Server认证中心 (前后端分离)
├── sa-token-demo-sso-client-h5 // [示例] Sa-Token 集成 SSO单点登录-client应用端 (前后端分离-原生h5 版本)
├── sa-token-demo-sso-server-vue2 // [示例] Sa-Token 集成 SSO单点登录-client应用端 (前后端分离-Vue2 版本)
├── sa-token-demo-sso-client-vue3 // [示例] Sa-Token 集成 SSO单点登录-client应用端 (前后端分离-Vue3 版本)
├── sa-token-demo-sso-for-solon // [示例] Sa-Token 集成 SSO 单点登录Solon 版)
├── sa-token-demo-sso-server-solon // [示例] Sa-Token 集成 SSO单点登录-Server认证中心
├── sa-token-demo-sso1-client-solon // [示例] Sa-Token 集成 SSO单点登录-模式一 应用端 (同域、同Redis)
├── sa-token-demo-sso2-client-solon // [示例] Sa-Token 集成 SSO单点登录-模式二 应用端 (跨域、同Redis)
├── sa-token-demo-sso3-client-solon // [示例] Sa-Token 集成 SSO单点登录-模式三 应用端 (跨域、跨Redis)
├── sa-token-demo-test // [示例] Sa-Token 整合测试项目
├── sa-token-demo-thymeleaf // [示例] Sa-Token 集成 Thymeleaf 标签方言
├── sa-token-demo-webflux // [示例] Sa-Token 整合 WebFlux
├── sa-token-demo-webflux-springboot3 // [示例] Sa-Token 整合 WebFlux SpringBoot3
├── sa-token-demo-websocket // [示例] Sa-Token 集成 Web-Socket 鉴权示例
├── sa-token-demo-websocket-spring // [示例] Sa-Token 集成 Web-SocketSpring封装版 鉴权示例
├── pom.xml // 示例 pom 文件,用于帮助在 idea 中一键导入所有 demo
├── sa-token-test // [测试] Sa-Token 单元测试合集
├── sa-token-springboot-test // [测试] Sa-Token SpringBoot 整合测试
├── sa-token-jwt-test // [测试] Sa-Token jwt 整合测试
├── sa-token-doc // [文档] Sa-Token 开发文档
├── pom.xml // [依赖] 顶级pom文件
├── LICENSE // 开源协议
├── mvn clean.bat // 一键 mvn clean 核心包+所有示例包
├── mvn test.bat // 一键单元测试
├── preview-doc.bat // 一键预览开发文档
├── README.md // 仓库自述文件
```
其它:
- [sa-token-demo-cross](https://gitee.com/sa-tokens/sa-token-demo-cross)Sa-Token 处理跨域示例。
- [sa-token-three-plugin](https://gitee.com/sa-tokens/sa-token-three-plugin)Sa-Token 第三方插件合集。
- [sa-token-study](https://gitee.com/sa-tokens/sa-token-study)Sa-Token 涉及知识点学习。

View File

@@ -4,9 +4,11 @@
<meta charset="UTF-8">
<title>Sa-Token</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Sa-Token是一个java权限认证框架功能全面上手简单登录认证、权限认证、Session会话、踢人下线、账号封禁、集成Redis、前后端分离、分布式会话、微服务网关鉴权、单点登录、OAuth2.0、临时Token验证、记住我模式、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成、WebFlux集成...有了sa-token你所有的权限认证问题都不再是问题">
<meta name="description"
content="Sa-Token是一个java权限认证框架功能全面上手简单登录认证、权限认证、Session会话、踢人下线、账号封禁、集成Redis、前后端分离、分布式会话、微服务网关鉴权、单点登录、OAuth2.0、临时Token验证、记住我模式、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成、WebFlux集成...有了sa-token你所有的权限认证问题都不再是问题">
<meta name="keywords" content="sa-token,sa-token框架,sa-token文档,java权限认证">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="logo.png">
<link rel="stylesheet" href="./static/doc.css">
<link rel="stylesheet" href="./static/vue.css">
@@ -18,16 +20,17 @@
<div class="logo-box">
<img src="logo.png" title="logo" />
<h1 class="logo-text">Sa-Token</h1>
<sub>v1.43.0</sub>
<sub>v1.44.0</sub>
</div>
</a>
</div>
<nav class="nav-right">
<div class="sear-box p-none" tabindex="-1" >
<div class="sear-box p-none" tabindex="-1">
<!-- 加载中…… -->
</div>
<select class="select-version p-none" onchange="location.href=this.value">
<option value="doc.html">最新版</option>
<option value="v/v1.43.0/doc.html">v1.43.0</option>
<option value="v/v1.42.0/doc.html">v1.42.0</option>
<option value="v/v1.41.0/doc.html">v1.41.0</option>
<option value="v/v1.40.0/doc.html">v1.40.0</option>
@@ -85,16 +88,16 @@
<div style="height: 5px;"></div>
<span style="background-color: #FFFFFF;"></span>
<span style="background-color: #f5f5f5;"></span>
<span style="background-color: #f5e5f5;"></span>
<span style="background-color: #F1FAFA;"></span>
<span style="background-color: #f5f5d5;"></span>
<span style="background-color: #d5f5f5;"></span>
<span style="background-color: #f5e5f5;"></span>
<span style="background-color: #E8E8FF;"></span>
<span style="background-color: #f0f9eb;"></span>
<span style="background-color: #d5f5f5;"></span>
<span style="background-color: #ebe5dd;"></span>
<span style="background-color: #e8f4ff;"></span>
<!-- <span style="background-color: #F0DAD2;"></span> -->
<!-- <span style="background-color: #f5d5d5;"></span> -->
<!-- <span style="background-color: #FFFFE0;"></span> -->
@@ -105,7 +108,6 @@
</div>
<a class="wzi" href="index.html">首页</a>
<a class="wzi" href="doc.html">文档</a>
<a class="p-none wzi" href="#/more/link">案例</a>
<div class="zk-box">
<a class="wzi" href="javascript:;">
<span>视频 </span>
@@ -113,12 +115,14 @@
</a>
<div class="zk-context">
<div>
<a href="https://www.bilibili.com/video/BV1fsUVBWEyH/" target="_blank">朱老师的小课堂7集</a>
<a href="https://www.bilibili.com/video/BV1NF1FBpEe6/" target="_blank">王清江唷 SSO篇29集</a>
<a href="https://www.bilibili.com/video/BV1uZUpYVEst/" target="_blank">fox说技术7集</a>
<a href="https://www.bilibili.com/video/BV1eFtRezERp?p=87" target="_blank">架构驿站11集</a>
<a href="https://www.bilibili.com/video/BV1Zt421u7gk/" target="_blank">王清江唷99集</a>
<a href="https://www.bilibili.com/video/BV1kG411o7Ms/" target="_blank">筑梦信仰-joy20集</a>
<a href="https://www.bilibili.com/video/BV11u4y197JL/" target="_blank">达达-Java26集</a>
<a href="https://space.bilibili.com/473679148/video" target="_blank">晒太阳的盐22集</a>
<a href="https://space.bilibili.com/473679148/video" target="_blank">晒太阳的盐22集</a>
<div class="zk-fengexian"></div>
<a href="javascript: layer.alert('如您有 Sa-Token 相关课程录制,请联系官网文档右侧 < sa-token 小助手 > 进行提交');">
[ + 课程提交 ]
@@ -126,11 +130,12 @@
</div>
</div>
</div>
<a class="p-none wzi" href="#/more/link">案例</a>
<a class="p-none wzi" href="#/more/join-group">加入讨论群</a>
<a class="p-none wzi" href="#/more/demand-commit">需求提交</a>
<!-- <a class="p-none wzi" href="#/more/blog">博客</a> -->
<a class="p-none wzi" href="#/more/join-group">加入讨论群</a>
<a class="p-none wzi" href="#/more/sa-token-donate">赞助</a>
<a class="p-none wzi" href="#/sso/sso-pro">🔥 SSO商业版</a>
<a class="p-none wzi" href="#/pro/st_doc_top">🔥 SSO/OAuth2 商业版</a>
<div class="zk-box">
<a class="wzi" href="javascript:;">
<span>相关资源 </span>
@@ -160,62 +165,50 @@
<h1 class="logo-text">Sa-Token</h1>
</div>
</a> -->
<div class="main-box">
<!-- 内容区 -->
<div id="app">加载中...</div>
<!-- 右边盒子 -->
<div class="doc-right-bj-box">
<div class="doc-right-bj-box-title">目录</div>
<div class="doc-right-more-item">
<!-- ad盒子 -->
<div class="ad-box">
<div class="ad-title">
<span class="ad-tips">推广信息:</span>
<span class="ad-tips ad-close">关闭</span>
</div>
<!-- ssp -->
<div class="top-ad-box" style="margin-bottom: 12px;">
<a href="http://sa-pro.dev33.cn?from=satop" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/sa-sso-pro-s3.png" />
<a href="https://sa-pro.yun94.cn?way=st_r" target="_blank">
<div class="mad-bg-box">
<div class="mad-context-box">
<img class="mad-img" src="/big-file/contact/sspx-ad-11.png" />
<span class="mad-text">
<b>轻松搭建SSO 单点登录、OAuth2.0 统一认证、API Key、用户数据同步。全源码交付、可二开。</b>
</span>
</div>
</div>
</a>
</div>
<!-- 万维广告div -->
<div class="wwads-cn wwads-horizontal" data-id="88" style="min-height: 0px; border: 1px #eee solid; margin-bottom: 12px;"></div>
<!-- ssp -->
<div class="top-ad-box top-ad-box2" style="margin-bottom: 12px;">
<a href="https://www.codefather.cn/vip?shareCode=qin883" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/bianchengdaohang.png" style="height: 26px;" />
</a>
<a href="https://www.mianshiya.com/?shareCode=skmky7" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/mianshiya.png" style="height: 26px;" />
</a>
<!-- <a href="http://sa-pro.dev33.cn?from=satop" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/sa-sso-pro-s3.png" />
</a> -->
<!--
<a href="http://sa-pro.dev33.cn?from=satop" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/sa-sso-pro-s3.png" />
</a>
<a href="http://sa-pro.dev33.cn?from=satop" target="_blank">
<img src="https://oss.dev33.cn/sa-token/ad/sa-sso-pro-s3.png" />
</a> -->
</div>
<div class="wwads-cn wwads-horizontal" data-id="88"
style="min-height: 0px; border: 1px #eee solid; margin-bottom: 12px;"></div>
</div>
<!-- help 按钮 -->
<div class="help-btn">❤️ 技术求助</div>
<!-- ew-wa -->
<div class="ew-wa">
<p>
<a href="https://pan.quark.cn/s/d9dd62340d62" target="_blank">离线版文档</a>
<a href="https://pan.quark.cn/s/d5abda720e88" target="_blank">离线版文档</a>
<a href="https://pan.quark.cn/s/fea7e5ec72ee" target="_blank">历史所有版本文档</a>
</p>
</div>
@@ -224,16 +217,16 @@
<p>如果 Sa-Token 帮助到了你,希望你可以向同事、朋友推荐了解本框架,这对我们非常重要,感谢支持! <!-- 🤗 --> </p>
<p>加油,工程师!</p>
</div>
</div>
</div>
</div>
<!-- 万维广告div -->
<!-- <div style="position: fixed; right: 0; bottom: 0; z-index: 10000; border: 0px #aaa solid;">
<div class="wwads-cn wwads-vertical" data-id="88" style="max-width:150px"></div>
</div> -->
<!-- 小助手div -->
<!-- <div class="p-none help-btn-box" style="position: fixed; right: 40px; bottom: 330px; z-index: 10000; border: 0px #aaa solid;">
<div class="help-tips" style="position: relative; left: -30px; top: -10px;"></div>
@@ -241,28 +234,32 @@
<span style="font-size: 18px; color: #FFF; line-height: 60px;">Help</span>
</div>
</div> -->
<!-- UI逐渐显现 -->
<style type="text/css">
body{opacity: 0.01; transition: opacity 0.5s; background-color: #FFF;}
body {
opacity: 0.01;
transition: opacity 0.5s;
background-color: #FFF;
}
</style>
<script type="text/javascript">
setTimeout(function() {
document.body.style.opacity = 1;
}, 1);
</script>
<!-- jqeury -->
<script src="static/jquery.min.js"></script>
<script src="static/layer-v3.1.1/layer.js"></script>
<!-- -->
<script src="./static/docsify-plugin.js?v=7"></script>
<script src="./static/is-star-plugin.js?v=7"></script>
<script src="./static/is-fill-in-wj-plugin.js?v=7"></script>
<script>
var saTokenTopVersion = '1.43.0'; // Sa-Token最新版本
var saTokenTopVersion = '1.44.0'; // Sa-Token最新版本
var name = '<img style="width: 60px; height: 60px; vertical-align: middle;" src="logo.png" alt="logo" /> ';
name += '<b style="font-size: 28px; vertical-align: middle;">Sa-Token</b> <sub>v' + saTokenTopVersion + '</sub>';
window.$docsify = {
@@ -289,11 +286,11 @@
},
// tab选项卡
tabs: {
persist : true, // 是否在刷新页面时重置选项卡
sync : false, // 页面上的多个tab是否同步切换
theme : 'classic', // 主题:'classic', 'material', false
tabComments: true, // 用注释来标注选项卡标题,例如:<!-- tab:SpringBoot -->
tabHeadings: true // 用标题+粗体来定制选项卡
persist: true, // 是否在刷新页面时重置选项卡
sync: false, // 页面上的多个tab是否同步切换
theme: 'classic', // 主题:'classic', 'material', false
tabComments: true, // 用注释来标注选项卡标题,例如:<!-- tab:SpringBoot -->
tabHeadings: true // 用标题+粗体来定制选项卡
},
// 阅读进度
progress: {
@@ -303,7 +300,7 @@
},
// 信息提示框
'flexible-alerts': {
style: 'flat', // 默认风格 callout=浅色flat=深色
style: 'flat', // 默认风格 callout=浅色flat=深色
note: {
label: {}
},
@@ -323,19 +320,19 @@
</script>
<script src="static/docsify.min.js"></script>
<script src="static/docsify-copy-code.min.js"></script>
<!-- 语言合集https://cdn.jsdelivr.net/npm/prismjs@1/components/ -->
<script src="static/prism/prism-java.min.js"></script>
<script src="static/prism/prism-gradle.min.js"></script>
<script src="static/prism/prism-yaml.min.js"></script>
<script src="static/prism/prism-properties.min.js"></script>
<!-- 文档阅读进度条 -->
<!-- <script src="static/docsify-plugins/progress.update.js"></script> -->
<!-- 右上角次级导航栏 -->
<script src="static/docsify-plugins/sub-nav-draw.js"></script>
<!-- 搜索框 -->
<script src="static/search.min.js"></script>
<!-- 多 tab 切换 -->
@@ -344,7 +341,7 @@
<script src="static/zoom-image.min.js"></script>
<!-- 好看的提示框 -->
<script src="static/docsify-plugins/docsify-plugin-flexible-alerts.min-1.1.1.js"></script>
<!-- docsify 里一个 md 引入另一个 md-->
<script src="static/docsify-plugins/docsify-betterembed-1.1.1.js"></script>
@@ -352,41 +349,41 @@
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/sidebar.min.css" />
<script src="https://cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js"></script> -->
<!-- 渲染赞助数据 -->
<script src="static/donate/donate-list.js"></script>
<script src="static/donate/donate-fun.js"></script>
<!-- 广告盒子 -->
<script>
(function(){
(function() {
// 功能6标题下面的广告
if($(window).width() >= 800) {
if ($(window).width() >= 800) {
// 如果一天内用户点击过关闭广告,则不再展现
let allowJg = 1000 * 60 * 60 * 24 * 1;
// allowJg = 1000 * 10;
try{
try {
const closeAdTime = localStorage.closeAdTime;
if(closeAdTime) {
if (closeAdTime) {
// 点击广告关闭的时间,和当前时间的差距
const closeAdJg = new Date().getTime() - parseInt(closeAdTime);
// 差距小于1天不再展示
if(closeAdJg < allowJg) {
if (closeAdJg < allowJg) {
console.log('not show ad ...');
$('.ad-box').remove();
return;
}
}
}catch(e){
} catch (e) {
console.error(e);
}
// 添加关闭事件
$('.ad-close').click(function(){
$('.ad-close').click(function() {
console.log('关闭广告');
// $('.top-ad-box').slideUp(); // 折叠收起
layer.confirm('关闭后,一天内不再展现此信息', function(){
layer.confirm('关闭后,一天内不再展现此信息', function() {
$(".ad-box").fadeOut(1000); // 淡出效果
layer.msg('关闭成功');
localStorage.closeAdTime = new Date().getTime();
@@ -395,7 +392,7 @@
}
})();
</script>
<!-- 搜索引擎自动提交 -->
<script>
(function() {
@@ -410,32 +407,33 @@
s.parentNode.insertBefore(bp, s);
})();
</script>
<!-- 万维广告 -->
<script data-mode="hash" type="text/javascript" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
<!-- 百度统计 -->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?35ad501304eae758ac6139a22a9830f5";
var s = document.getElementsByTagName("script")[0];
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script type="text/javascript">
// 预览版提示
if(location.host === 'rc.sa-token.cc') {
const newTips = '<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.cc/" target="_blank">https://sa-token.cc/</a></b>';
if (location.host === 'rc.sa-token.cc') {
const newTips =
'<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.cc/" target="_blank">https://sa-token.cc/</a></b>';
layer.alert(newTips);
}
</script>
<!-- 小助手提示 -->
<script>
$('.help-btn').click(function(){
$('.help-btn').click(function() {
var str = `
<div class="xiaozhushou-intro">
<h2>报错了?搞不懂?别急、莫慌</h2>
@@ -454,13 +452,13 @@
<p style="margin-top: 30px;">打开方式:</p>
<p>1、如果你是使用 PC 端微信,请点此链接:<a href="https://work.weixin.qq.com/kfid/kfcdd45c432fee9655f" target="_blank">https://work.weixin.qq.com/kfid/kfcdd45c432fee9655f</a></p>
<p>2、如果你是使用手机端微信请扫码</p>
<p><img src="https://oss.dev33.cn/sa-token/sa-token-xiaozhushou.jpg" width="200px"></p>
<p><img src="/big-file/contact/sa-token-xiaozhushou.jpg" width="200px"></p>
<p>如果您的问题已解决,我们希望您能够花费一点时间将解决方案发布在:<a href="https://gitee.com/dromara/sa-token/issues/I9I9CY" target="_blank">踩坑记录征集</a>,帮助以后遇到同样问题的开发者快速排查,感激不尽!🌹🌹🌹</p>
</div>
`;
layer.alert(str, {
title: '技术求助',
area: '680px',
title: '技术求助',
area: '680px',
offset: '7%',
})
})
@@ -477,120 +475,58 @@
// console.error(e);
// }
// }, 500)
</script>
<!-- 修改背景颜色 -->
<script>
// 绑定修改背景色的按钮事件
$('.theme-box span').click(function() {
let bgColor = this.style.backgroundColor;
setBg(bgColor);
localStorage.setItem('bg-color-value', bgColor)
})
// 读取上次记录
let bgColor = localStorage.getItem('bg-color-value');
if(bgColor) {
setBg(bgColor);
}
// 设置背景颜色
function setBg(bgColor) {
console.log('---- 背景颜色设定为:', bgColor);
// -------- 设置 body 背景
document.body.style.backgroundColor = bgColor;
// -------- 设置 header 头背景
// 如果是 16 进制,转 rgba
if(bgColor.indexOf('#') == 0) {
bgColor = hexToRgba(bgColor, 0.97);
}
// 如果是 rgb转 rgba
else if(bgColor.match(/\,/g).length == 2) {
bgColor = bgColor.replace(')', ' ,0.97)');
}
document.querySelector('.doc-header').style.backgroundColor = bgColor;
}
// 16进制 转 rgba
function hexToRgba(str, a){
a = a || 1;
var reg = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
if(!reg.test(str)){return;}
let newStr = (str.toLowerCase()).replace(/\#/g,'')
let len = newStr.length;
if(len == 3){
let t = ''
for(var i=0;i<len;i++){
t += newStr.slice(i,i+1).concat(newStr.slice(i,i+1))
}
newStr = t
}
let arr = []; //将字符串分隔,两个两个的分隔
for(var i =0;i<6;i=i+2){
let s = newStr.slice(i,i+2)
arr.push(parseInt("0x" + s))
}
return 'rgb(' + arr.join(",") + ', ' + a + ')';
}
</script>
<!-- 修改背景颜色 水滴波纹特效 -->
<link rel="stylesheet" href="static/water-change-theme/water-change-theme.css" />
<script src="static/water-change-theme/gsap-3.12.2.min.js"></script>
<script src="static/water-change-theme/water-change-theme.js"></script>
<!-- 赞助页的展开和收缩 -->
<script>
// 展开
function expandZanZhu(){
function expandZanZhu() {
$('.zk-btn--1').hide();
$('.zk-btn--2').show();
$('.zanzhu-box').height($('.zanzhu-box table').height());
}
// 折叠
function foldZanZhu(){
function foldZanZhu() {
$('.zanzhu-box').height(500);
$('.zk-btn--2').hide();
$('.zk-btn--1').show();
}
</script>
<!-- 赞助效果图展示 -->
<!-- 自定义滚动条颜色 -->
<!-- <style>
/* 自定义body滚动条样式 */
body::-webkit-scrollbar { width: 8px; }
/* 滚动条颜色 */
body::-webkit-scrollbar-thumb { background-color: green; border-radius: 3px; }
/* 滚动条上面的和下面的颜色 */
body::-webkit-scrollbar-track {
background: linear-gradient(to bottom,
#42B983 0%,
#42B983 var(--scroll-progress, 0%),
#FCFCFC var(--scroll-progress, 0%),
#FCFCFC 100%);
}
</style>
<script>
function showSyzz(){
layer.photos({
photos: {
title: '',
id: new Date().getTime(),
start: 0,
data: [
{
pid: 1,
alt: 'gitee 开源项目推广,日增 star 74',
src: 'https://oss.dev33.cn/sa-token/more/syzz-xg-1.png',
},
{
pid: 2,
alt: 'gitee 开源项目推广,日增 star 247',
src: 'https://oss.dev33.cn/sa-token/more/syzz-xg-2.png',
},
{
pid: 3,
alt: '某互联网公司线下活动,报名邀请',
src: 'https://oss.dev33.cn/sa-token/more/syzz-xg-3.png',
},
{
pid: 4,
alt: 'gitee 开源项目推广,日增 star 70',
src: 'https://oss.dev33.cn/sa-token/more/syzz-xg-4.png',
}
]
}
,anim: 5 //0-6的选择指定弹出图片动画类型默认随机请注意3.0之前的版本用shift参数
});
}
</script>
// 动态更新滚动条颜色
window.addEventListener('scroll', function() {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const scrollHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
const scrollProgress = (scrollTop / scrollHeight) * 100;
document.body.style.setProperty('--scroll-progress', scrollProgress + '%');
});
// 初始化滚动条状态
window.dispatchEvent(new Event('scroll'));
</script> -->
</body>
</html>
</html>

View File

@@ -4,12 +4,12 @@
### Sa-Token 功能结构图:
![sa-token-rz](https://oss.dev33.cn/sa-token/art/sa-token-js4.png 's-w')
<img class="s-w" src="/big-file/doc/fun/sa-token-js4--2.png" alt="sa-token-rz" />
### Sa-Token 认证流程图:
![sa-token-rz](https://oss.dev33.cn/sa-token/art/sa-token-rz2.png 's-w')
<img class="s-w" src="/big-file/doc/fun/sa-token-rz2.png" alt="sa-token-rz" />
<!-- ![sa-token-rz](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/sa-token-rz.png 's-w') -->
PS鼠标右键选择 **`[在新窗口打开图片]`** 即可高清模式查看图片。(本流程图使用 [ProcessOn](https://www.processon.com) 绘制完成)
PS鼠标右键选择 **`[在新窗口打开图片]`** 即可高清模式查看图片。

View File

@@ -2,4 +2,8 @@
<!-- 参考:[https://blog.csdn.net/shengzhang_/article/details/119928794](https://blog.csdn.net/shengzhang_/article/details/119928794) -->
参考[https://juejin.cn/post/7491603065944129590](https://juejin.cn/post/7491603065944129590)
参考1: [https://juejin.cn/post/7491603065944129590](https://juejin.cn/post/7491603065944129590)
参考2: [https://mp.weixin.qq.com/s/tbqjCKrTMj-l1lZbeyu81g](https://mp.weixin.qq.com/s/tbqjCKrTMj-l1lZbeyu81g)
参考3: [https://mp.weixin.qq.com/s/8aziIhqGCb_qsr8kLiqzmg](https://mp.weixin.qq.com/s/8aziIhqGCb_qsr8kLiqzmg)

View File

@@ -16,11 +16,11 @@ public String test() {
从浏览器访问此接口,我们可以看到:
![test-curr-domain.png](https://oss.dev33.cn/sa-token/doc/test-curr-domain.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/fun/test-curr-domain.png" alt="test-curr-domain.png" />
此 API 在本地开发时一般可以正常工作,然而如果我们在部署时使用 Nginx 做了一层反向代理后,其最终结果可能会和我们预想的有一点偏差:
![test-curr-domain-fxdl.png](https://oss.dev33.cn/sa-token/doc/test-curr-domain-fxdl.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/fun/test-curr-domain-fxdl.png" alt="test-curr-domain-fxdl.png" />
不仅是 Nginx所有包含路由转发的地方都有可能导致上述丢失 uri 的现象解决方案也很简单既然程序无法自动识别我们改成手动获取即可Sa-Token 提供两个方案:
@@ -29,7 +29,7 @@ public String test() {
##### 1、首先在 Nginx 代理转发的地方增加参数
![nginx-add-header.png](https://oss.dev33.cn/sa-token/doc/nginx-add-header.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/fun/nginx-add-header.png" alt="nginx-add-header.png" />
重点是这一句:`proxy_set_header Public-Network-URL http://$http_host$request_uri;`

View File

@@ -3,12 +3,12 @@
2. 滑动右侧页面滑块, 查看页面内容最下方, 评论区上方
3. 找到这一行文字
![在线编辑提示](https://oss.dev33.cn/sa-token/doc/git-pr/online_1.png)
<img src="/big-file/doc/fun/online_1.png" alt="在线编辑提示" />
4. 点击Gitee或GitHub按钮中的任意一个, 国内用户推荐使用 [Gitee](https://gitee.com) (请先注册登录后再往下浏览)
5. 此时会进入当前页面源码预览页面,找到下方按钮组
![按钮组](https://oss.dev33.cn/sa-token/doc/git-pr/online_2.png)
<img src="/big-file/doc/fun/online_2.png" alt="按钮组" />
6. 点击编辑按钮
7. 此时进入待修改页面的源码页面, 按照markdown格式编辑为需要的结果(Ctrl+P可查看最终效果,再次按下可恢复源码界面)
@@ -36,16 +36,16 @@ git config --list
1. 点击[Gitee](https://gitee.com/dromara/sa-token)或[Github](https://github.com/dromara/sa-token)进入Sa-Token项目主页, 以下以Gitee为例,Github类似(请先注册登录后再往下浏览)
2. 找到页面右上角的按钮组, 点击Forked按钮
![按钮组](https://oss.dev33.cn/sa-token/doc/git-pr/code_1.png)
<img src="/big-file/doc/fun/code_1.png" alt="按钮组" />
3. 选择个人仓库并点击确认
4. 此时在你的个人仓库中会多了一个Sa-Token项目
5. 在新的Sa-Token项目中, 点击 ![克隆/下载](https://oss.dev33.cn/sa-token/doc/git-pr/code_2.png) 按钮, 点击弹出框里面的复制按钮
5. 在新的Sa-Token项目中, 点击 <img src="/big-file/doc/fun/code_2.png" alt="克隆/下载" /> 按钮, 点击弹出框里面的复制按钮
6. 在本地某空文件夹下右键选择: git bash here
![git bash](https://oss.dev33.cn/sa-token/doc/git-pr/code_4.png)
<img src="/big-file/doc/fun/code_4.png" alt="git bash" />
![git bash 打开后的图](https://oss.dev33.cn/sa-token/doc/git-pr/code_3.png)
<img src="/big-file/doc/fun/code_3.png" alt="git bash 打开后的图" />
14. 在里面输入如下命令, 按换行后自动下载整个项目
@@ -61,18 +61,18 @@ git clone 这里替换为复制后的链接
### 方式一
1. 在idea中打开项目进入Commit选项
![本地暂存](https://oss.dev33.cn/sa-token/doc/git-pr/code_5.png)
<img src="/big-file/doc/fun/code_5.png" alt="本地暂存" />
2. 勾选需要本地暂存的文件
3. 在同一页面的下方输入提示信息
![提示信息](https://oss.dev33.cn/sa-token/doc/git-pr/code_6.png)
<img src="/big-file/doc/fun/code_6.png" alt="提示信息" />
4. 点击Commit按钮暂存到本地, 点击Commit and Push按钮暂存之后提交到远程
### 方式二
1. 除了点击Commit and Push按钮外,还有一个地方可以提交git
![git按钮](https://oss.dev33.cn/sa-token/doc/git-pr/code_7.png)
<img src="/big-file/doc/fun/code_7.png" alt="git按钮" />
2. 位置在idea右上方的工具栏里面
3. 指向左下箭头为拉取项目,可以随时更新
@@ -82,11 +82,11 @@ git clone 这里替换为复制后的链接
1. 提交后进入Gitee个人仓库中克隆的Sa-Token项目
2. 找到下图的Pull Request按钮
![工具栏](https://oss.dev33.cn/sa-token/doc/git-pr/code_8.png)
<img src="/big-file/doc/fun/code_8.png" alt="工具栏" />
3. 点击提交, 进入如下页面
![提交信息填写页面](https://oss.dev33.cn/sa-token/doc/git-pr/code_9.png 's-width')
<img class="s-width" src="/big-file/doc/fun/code_9.png" alt="提交信息填写页面" />
4. 在这里,你可以选择要提交的分支,一般都是dev开发分支.可以填写合并信息,其他测试审查之类的可以不填写, 最后点击创建即可完成一次提交.
@@ -94,7 +94,7 @@ git clone 这里替换为复制后的链接
1. 有时候主项目更新了,之前克隆的项目代码陈旧,如何处理?
2. 在个人仓库的Sa-Token项目主页面中, 找到下图的圆圈
![更新按钮](https://oss.dev33.cn/sa-token/doc/git-pr/code_10.png)
<img src="/big-file/doc/fun/code_10.png" alt="更新按钮" />
3. 点击右侧圆圈按钮后Gitee会自动同步主项目, 这样就不用像我之前一样,删除项目又重新fork了.

View File

@@ -14,7 +14,7 @@
解决这个问题的关键就在于 `SaTokenContext` 接口,此接口的作用是屏蔽掉不同 Web 框架之间的差异提供统一的调用API
![sa-token-context](https://oss.dev33.cn/sa-token/doc/sa-token-context.svg 's-w')
<img class="s-w" src="/big-file/doc/fun/sa-token-context.svg" alt="sa-token-context" />
SaTokenContext只是一个接口没有工作能力这也就意味着 SaTokenContext 接口的实现是必须的。

View File

@@ -60,7 +60,7 @@ public static void setContext(HttpServletRequest request, HttpServletResponse re
Sa-Token 为了一套代码对接所有的 Web 框架,就在原生请求对象的基础上又封装了一层 `SaTokenContext` 相关接口,用于屏蔽掉不同 Web 框架之间的差异提供统一的调用API
![sa-token-context](https://oss.dev33.cn/sa-token/doc/plugin/sa-token-context-2.svg)
<img src="/big-file/doc/fun/sa-token-context-2.svg" alt="sa-token-context" />
因此,要对接不同的 Web 框架,就要针对不同的 Web 框架封装不同版本的 `SaRequest`、`SaResponse`、`SaStorage` 包装类对象。

View File

@@ -99,7 +99,7 @@ session.updateTimeout(1000); // 参数说明和全局有效期保持一致
**假设三个客户端登录同一账号且配置了不共享token那么此时的Session模型是**
![session-model](https://oss.dev33.cn/sa-token/doc/session-model3.png 's-w')
<img class="s-w" src="/big-file/doc/fun/session-model3.png" alt="session-model" />
简而言之:
- `Account-Session` 以账号 id 为主,只要 token 指向的账号 id 一致那么对应的Session对象就一致

View File

@@ -12,17 +12,17 @@
<th>个人主页</th>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-xiaofengzheng.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-xiaofengzheng.jpg" /></td>
<td>小风筝(作者)</td>
<td><a href="https://gitee.com/click33" target="_blank">https://gitee.com/click33</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-AppleOfGray.png" /></td>
<td><img src="/big-file/doc/team/avatar-AppleOfGray.png" /></td>
<td>AppleOfGray</td>
<td><a href="https://gitee.com/appleOfGray" target="_blank">https://gitee.com/appleOfGray</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-ly-chn.png" /></td>
<td><img src="/big-file/doc/team/avatar-ly-chn.png" /></td>
<td>ly-chn</td>
<td><a href="https://gitee.com/ly-chn" target="_blank">https://gitee.com/ly-chn</a></td>
</tr>
@@ -41,42 +41,42 @@
<th>个人主页</th>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-xiaofengzheng.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-xiaofengzheng.jpg" /></td>
<td>刘潇</td>
<td><a href="https://gitee.com/click33" target="_blank">https://gitee.com/click33</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-AppleOfGray.png" /></td>
<td><img src="/big-file/doc/team/avatar-AppleOfGray.png" /></td>
<td>AppleOfGray</td>
<td><a href="https://gitee.com/appleOfGray" target="_blank">https://gitee.com/appleOfGray</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-ly-chn.png" /></td>
<td><img src="/big-file/doc/team/avatar-ly-chn.png" /></td>
<td>ly-chn</td>
<td><a href="https://gitee.com/ly-chn" target="_blank">https://gitee.com/ly-chn</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-moli.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-moli.jpg" /></td>
<td>茉莉</td>
<td><a href="https://gitee.com/kidoldman" target="_blank">https://gitee.com/kidoldman</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-yaoshui.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-yaoshui.jpg" /></td>
<td>药水</td>
<td><a href="https://gitee.com/java_pioneer" target="_blank">https://gitee.com/java_pioneer</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-daimouren.png" /></td>
<td><img src="/big-file/doc/team/avatar-daimouren.png" /></td>
<td>呆某人</td>
<td><a href="https://gitee.com/zhubj0510" target="_blank">https://gitee.com/zhubj0510</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-chunkunqiufa.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-chunkunqiufa.jpg" /></td>
<td>春困夏倦秋乏</td>
<td><a href="https://gitee.com/uncarbon97" target="_blank">https://gitee.com/uncarbon97</a></td>
</tr>
<tr>
<td><img src="https://oss.dev33.cn/sa-token/team/avatar-danmo.jpg" /></td>
<td><img src="/big-file/doc/team/avatar-danmo.jpg" /></td>
<td>淡墨</td>
<td><a href="https://gitee.com/jinan-jimeng-network_0" target="_blank">https://gitee.com/jinan-jimeng-network_0</a></td>
</tr>

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@
由于`jwt`模式不在服务端存储数据,对于比较复杂的业务可能会功能受限,因此更加推荐使用方案三
<button class="show-img" img-src="https://oss.dev33.cn/sa-token/doc/g/g3--dcs-session.gif">加载动态演示图</button>
<button class="show-img" img-src="/big-file/doc/micro/g3--dcs-session.gif">加载动态演示图</button>
集成依赖示例:

View File

@@ -18,6 +18,9 @@ Sa-Token提供两种解决方案
本篇主要讲解方案二 `Same-Token` 模块的整合步骤,其鉴权流程与 OAuth2.0 类似不过使用方式上更加简洁希望使用方案一的同学可参考Sa-OAuth2模块此处不再赘述
<img class="w-100" src="/big-file/doc/micro/micro-network-isolation.svg" alt="Same-Token_同源系统认证.svg" />
### 二、网关转发鉴权
##### 1、引入依赖
@@ -201,7 +204,12 @@ public interface SpCfgInterface {
Same-Token —— 专门解决同源系统互相调用时的身份认证校验,它的作用不仅局限于微服务调用场景
基本使用流程为服务调用方获取Token提交到请求中被调用方取出Token进行校验Token一致则校验通过,否则拒绝服务
基本使用流程为:服务调用方获取 Same-Token提交到请求中被调用方取出 Same-Token 进行校验:如果一致则校验通过,否则拒绝服务
<img class="w-100" src="/big-file/doc/micro/micro-same-token.svg" alt="Same-Token_同源系统认证.svg" />
首先我们预览一下此模块的相关API
``` java

View File

@@ -114,13 +114,10 @@ SpringMVCUtil.isWeb(); // 判断当前是否处于 Web 上下文
Sa-Token集成Reactor时的 ServerWebExchange 工具类,位于包:`sa-token-reactor-spring-boot-starter`
``` java
// 异步方式获取 ServerWebExchange 对象
SaReactorHolder.getContext().map(e -> {
SaReactorHolder.getMonoExchange().map(e -> {
System.out.println(e);
return e;
});
// 同步方式获取 ServerWebExchange 对象
ServerWebExchange e = SaReactorSyncHolder.getContext();
System.out.println(e);
```

View File

@@ -6,8 +6,6 @@
### 1、加入QQ交流群
<!-- ![QQ群](https://oss.dev33.cn/sa-token/qr/qq-group-5-gsa.png ':size=180') -->
<!-- QQ交流群685792424 [点击加入](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Y05Ld4125W92YSwZ0gA8e3RhG9Q4Vsfx&authKey=IomXuIuhP9g8G7l%2ByfkrRsS7i%2Fna0lIBpkTXxx%2BQEaz0NNEyJq00kgeiC4dUyNLS&noverify=0&group_code=685792424)
-->
@@ -16,9 +14,9 @@ QQ交流群823181187 [点击加入](https://qm.qq.com/q/EBIJVZBVGE)
### 2、加入微信交流群
<!-- ![微信群](https://oss.dev33.cn/sa-token/wx-qr-300.png ':size=180') -->
<!-- <img class="s-w" src="/big-file/contact/wx-qr-300.png" style="width: 180px;" alt="微信群" /> -->
![微信群](https://oss.dev33.cn/sa-token/qr/i-wx-qr2.png ':size=175')
<img class="s-w" src="/big-file/contact/i-wx-qr2.jpg" style="width: 180px;" alt="微信群" />
扫码添加微信备注sa邀您加入群聊

View File

@@ -41,16 +41,22 @@ Sa-Token 无意发明任何晦涩概念提升逼格,但在处理 issue 、Q群
- 单地登录:指同一时间只能在一个地方登录,新登录会挤掉旧登录,也可以叫:单端登录。
- 多地登录:指同一时间可以在不同地方登录,新登录会和旧登录共存,也可以叫:多端登录。
- 同端互斥登录在同一类型设备上只允许单地点登录在不同类型设备上允许同时在线参考腾讯QQ的登录模式手机和电脑可以同时在线但不能两个手机同时在线。
- 限量登录:限定账号登录设备总数量,低于此数量时可以正常登录,高于此数量后每次登录自动清退一个之前的登录。
- 记住我模式:指在一个设备终端登录成功,该设备重启之后依然保持登录状态。
- 单点登录:在进入多个系统时,只需要登录一次即可。解决用户在不同系统间频繁登录的问题。
- 同端多登录:指在一个终端可以同时登录多个账号。
- 记住我模式:指在一个设备终端登录成功,该设备重启之后依然保持登录状态。
#### 几种注销策略:
- 单端注销:只在调用登录的一端注销。
- 全端注销:一端注销,全端下线。
- 同端注销:发起注销后,同类型设备端一起下线,不同设备类型不受影响。
- 单点注销:与单点登录对应,一个系统注销,所有系统一起下线。
<p><a class="case-btn case-btn-video" href="https://www.bilibili.com/video/BV1XrzABbEa1/" target="_blank">
视频讲解:如何设计出最优的登录会话策略?单端登录、强制下线、多端互踢、记住我登录
</a></p>
#### 几种鉴权方式:
- 代码鉴权:在代码里直接调用 `StpUtil.checkXxx` 相关 API 进行鉴权。

View File

@@ -10,7 +10,7 @@ Sa-Token 采用 Apache-2.0 开源协议,**承诺框架本身与官网文档永
您可以在项目 [Gitee](https://gitee.com/dromara/sa-token) 主页进行捐赠
![gitee-zanzhu2.png](https://oss.dev33.cn/sa-token/doc/gitee-zanzhu2.png)
<!-- ![gitee-zanzhu2.png](https://oss.dev33.cn/sa-token/doc/gitee-zanzhu2.png) -->
@@ -176,7 +176,7 @@ Sa-Token 目前总计14+微信交流群每个群人数大约400以上
- 拒绝接受违反法律法规、以及灰色相关的产品推广为避免不必要的麻烦目前也拒绝推广IP代理、上网工具等等。
- 为避免过多打扰群友,目前一天内至多在群里推广两次,超过次数的可顺延到第二天。
有意见合作者可直接在 gitee 发起赞赏后,将您的产品信息发至 [ sa-pro 小助手 ] ,加好友链接点 [这里](http://sa-pro.dev33.cn/)点击后往下拉有二维码添加时请备注Sa-Token 商业赞助。
有意见合作者可直接在 gitee 发起赞赏后,将您的产品信息发至 [ sa-pro 小助手 ] ,加好友链接点 [这里](https://sa-pro.yun94.cn/)点击后往下拉有二维码添加时请备注Sa-Token 商业赞助。
注:在群发消息时,我们会明确对群友声明,此条消息为赞助商的产品,属于硬广信息。如您介意这一点,我们将暂时无法与您合作。

View File

@@ -2,16 +2,17 @@
---
Sa-Token 采用 Apache-2.0 开源协议,**承诺框架本身与官网文档永久免费开放**
Sa-Token 采用 Apache-2.0 开源协议,<green>**承诺框架本身与官网文档永久免费开放**</green>
但是框架的日常更新与社区运营需要付出大量的精力,靠爱发电难以长久,如果 Sa-Token 帮助到了您,您可以友情支持一下 Sa-Token。
### 友情赞助
您可以在项目 [Gitee](https://gitee.com/dromara/sa-token) 主页进行捐赠
<!-- 您可以在项目 [Gitee](https://gitee.com/dromara/sa-token) 主页进行捐赠
![gitee-zanzhu2.png](https://oss.dev33.cn/sa-token/doc/gitee-zanzhu2.png)
<img src="/big-file/doc/more/gitee-zanzhu2.png" alt="gitee-zanzhu2.png" /> -->
<img src="/big-file/contact/wx-zsm.png" alt="微信赞赏码" style="width: 280px;" />
**已捐赠列表:**
@@ -58,7 +59,7 @@ Sa-Token 目前总计18+微信交流群每个群人数大约400以上
- 拒绝接受违反法律法规、以及灰色相关的产品推广为避免不必要的麻烦目前也拒绝推广IP代理、上网工具等等。
- 为避免过多打扰群友,目前一天内至多在群里推广一次,超过次数的可顺延到第二天。
有意见合作者可直接在 gitee 发起赞赏后,将您的产品信息发至 [ sa-pro 小助手 ] ,加好友链接点 [这里](http://sa-pro.dev33.cn/)点击后往下拉有二维码添加时请备注Sa-Token 商业赞助。
有意见合作者可直接在 gitee 发起赞赏后,将您的产品信息发至 [ sa-pro 小助手 ] ,加好友链接点 [这里](https://sa-pro.yun94.cn/)点击后往下拉有二维码添加时请备注Sa-Token 商业赞助。
注:在群发消息时,我们会明确对群友声明,此条消息为赞助商的产品,属于硬广信息。如您介意这一点,我们将暂时无法与您合作。

View File

@@ -1,5 +1,17 @@
# 更新日志
### v1.44.0 @2025-6-7
- 修复:修复 sso-server 前后端分离示例无法正常登录的问题。
- 修复:修复 SSO 模式三全端注销失效的问题。
- 修复:修复 SSO `SaSsoClientModel` 部分场景下无法序列化的问题。
- 新增OAuth2 模块新增支持从 `SaOAuth2DataLoader` 接口获取高级权限与低级权限的方法。merge: [pr 339](https://gitee.com/dromara/sa-token/pulls/339)
- 修复:修复 `sa-token-dubbo``sa-token-dubbo3` 每次调用都强制需要上下文的问题。
- 文档:新增 `sa-token-dubbo3` 的说明。
- 文档:更新赞助者名单。
- 文档:新增 `loveqq-framework` 框架集成包。 **[重要]** merge: [pr 339](https://gitee.com/dromara/sa-token/pulls/340)
### v1.43.0 @2025-5-17
- core:
@@ -68,6 +80,7 @@
### v1.42.0 @2025-4-11
更新导读:[视频](https://www.bilibili.com/video/BV1h85izzEe8/)、[文字版](https://juejin.cn/post/7491971657201451062)
- core:
- 新增: 新增 `API Key` 模块。 **[重要]**

View File

@@ -33,7 +33,7 @@ public class SaOAuth2DataLoaderImpl implements SaOAuth2DataLoader {
当不知情的小红被诱导访问了这个 URL 时,它将被重定向至百度首页。
![oauth2-ticket-jc](https://oss.dev33.cn/sa-token/doc/oauth2-new/oauth2-ticket-jc.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/oauth2-ticket-jc.png" alt="oauth2-ticket-jc" />
可以看到,代表着用户身份的 code 授权码也显现到了URL之中借此漏洞攻击者完全可以构建一个 URL 将小红的 code 授权码自动提交到攻击者自己的服务器,伪造小红身份登录网站。
@@ -64,7 +64,7 @@ public class SaOAuth2DataLoaderImpl implements SaOAuth2DataLoader {
再次访问上述链接:
![oauth2-feifa-rf](https://oss.dev33.cn/sa-token/doc/oauth2-new/oauth2-feifa-rf.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/oauth2-feifa-rf.png" alt="oauth2-feifa-rf" />
URL 没有通过校验,拒绝授权!

View File

@@ -117,11 +117,11 @@ public class SaOAuth2ServerH5Controller {
在前端 ide 中导入 demo 案例的 `sa-token-demo-oauth2-server-h5` 项目,然后直接预览 `oauth2-authorize.html` 页面,如图所示:
![sa-oauth2-server-authorize-h5.png](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-server-authorize-h5.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-server-authorize-h5.png" alt="sa-oauth2-server-authorize-h5.png" />
复制上述地址,然后将其配置到 “OAuth2前端测试页” 的 “OAuth2 Server 授权页地址” 选项中,其它选项保持默认不变:
![sa-oauth2-client-test-h5-page-setting.png](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-client-test-h5-page-setting.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-client-test-h5-page-setting.png" alt="sa-oauth2-client-test-h5-page-setting.png" />
然后根据 “OAuth2前端测试页” 的页面提示进行测试即可,此处不再赘述。

View File

@@ -227,14 +227,14 @@ http://sa-oauth-server.com:8000/oauth2/authorize?response_type=code&client_id=10
2、由于首次访问我们在OAuth-Server端暂未登录会被转发到登录视图
![sa-oauth2-server-login-view](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-server-login-view--v43.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-server-login-view--v43.png" alt="sa-oauth2-server-login-view" />
3、输入 `sa/123456` 进行登录之后,会提示我们确认授权
![sa-oauth2-server-scope](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-server-scope.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-server-scope.png" alt="sa-oauth2-server-scope" />
4、点击同意授权之后我们会被重定向至 redirect_uri 页面并携带了code参数
![sa-oauth2-server-code](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-server-code.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-server-code.png" alt="sa-oauth2-server-code" />
4、我们拿着code参数访问以下地址
``` url
@@ -259,7 +259,6 @@ http://sa-oauth-server.com:8000/oauth2/token?grant_type=authorization_code&clien
}
```
<!-- ![sa-oauth2-server-token](https://oss.dev33.cn/sa-token/doc/oauth2/sa-oauth2-server-token.png 's-w-sh') -->
测试完毕
@@ -272,7 +271,7 @@ http://sa-oauth-server.com:8000/oauth2/token?grant_type=authorization_code&clien
依次启动`OAuth2-Server` 与 `OAuth2-Client`,然后从浏览器访问:[http://sa-oauth-client.com:8002](http://sa-oauth-client.com:8002)
![sa-oauth2-client-index](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-client-index.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-client-index.png" alt="sa-oauth2-client-index" />
如图可以针对OAuth2.0四种模式进行详细测试
@@ -286,7 +285,7 @@ OAuth2 前端测试页:
此示例允许你在前端自由配置 OAuth-Client 端所需的各个参数,方便对 OAuth2 四种模式的测试。
![sa-oauth2-client-index](https://oss.dev33.cn/sa-token/doc/oauth2-new/sa-oauth2-client-test-h5-page.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/oauth2-new/sa-oauth2-client-test-h5-page.png" alt="sa-oauth2-client-index" />
<p><a class="case-btn case-btn-video" href="https://www.bilibili.com/video/BV13LSMYzEmE/" target="_blank">
参考视频OAuth2 四种模式 前端测试页

View File

@@ -23,7 +23,7 @@ OAuth2.0 与 SSO 相比,增加了对应用授权范围的控制,减弱了应
3. 密码式PasswordClient 端直接拿着用户的账号密码换取授权 `Access-Token`
4. 客户端凭证Client CredentialsServer 端针对 Client 级别的 Token代表应用自身的资源授权。
![https://oss.dev33.cn/sa-token/doc/oauth2/sa-oauth2-setup.png](https://oss.dev33.cn/sa-token/doc/oauth2/sa-oauth2-setup.png)
<img src="/big-file/doc/oauth2-new/sa-oauth2-setup.png" alt="sa-oauth2-setup.png" />
接下来我们将通过简单示例演示如何在 Sa-Token-OAuth2 中完成这四种模式的对接: [搭建OAuth2-Server](/oauth2/oauth2-server)

View File

@@ -7,7 +7,7 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起
> 搭建两个Redis服务器一个专门用来做业务缓存另一台专门存放Sa-Token权限数据
<button class="show-img" img-src="https://oss.dev33.cn/sa-token/doc/g/g3--alone-redis.gif">加载动态演示图</button>
<button class="show-img" img-src="/big-file/doc/plugin/g3--alone-redis.gif">加载动态演示图</button>
要将Sa-Token的数据单独抽离出来很简单你只需要为Sa-Token单独配置一个Redis连接信息即可
@@ -154,7 +154,7 @@ public class TestController {
分别访问两个接口观察Redis中增加的数据
![alone-redis](https://oss.dev33.cn/sa-token/doc/alone-redis.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/alone-redis.png" alt="alone-redis" />
测试完毕!

View File

@@ -6,7 +6,7 @@ API Key应用程序编程接口密钥 是一种用于身份验证和授权
示例仓库地址:[sa-token-demo-apikey](https://gitee.com/dromara/sa-token/tree/master/sa-token-demo/sa-token-demo-apikey) 🔗
![sa-api-key](https://oss.dev33.cn/sa-token/doc/plugin/sa-api-key.png 's-w-sh')
<img class="s-w-sh" src="/big-file/doc/plugin/sa-api-key.png" alt="sa-api-key" />
### 1、需求场景

View File

@@ -34,7 +34,7 @@ public void rewriteComponent() {
效果图:
![sa-custom-serializer-tiangan.png](https://oss.dev33.cn/sa-token/doc/plugin/sa-custom-serializer-tiangan.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-tiangan.png" alt="sa-custom-serializer-tiangan.png" />
#### 2、SaSerializerForBase64UsePeriodicTable
@@ -50,7 +50,7 @@ public void rewriteComponent() {
效果图:
![sa-custom-serializer-yszqb.png](https://oss.dev33.cn/sa-token/doc/plugin/sa-custom-serializer-yszqb.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-yszqb.png" alt="sa-custom-serializer-yszqb.png" />
@@ -67,7 +67,7 @@ public void rewriteComponent() {
效果图:
![sa-custom-serializer-tsfh.png](https://oss.dev33.cn/sa-token/doc/plugin/sa-custom-serializer-tsfh.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-tsfh.png" alt="sa-custom-serializer-tsfh.png" />
#### 4、SaSerializerForBase64UseEmoji
@@ -83,9 +83,9 @@ public void rewriteComponent() {
效果图:
![sa-custom-serializer-emoji.png](https://oss.dev33.cn/sa-token/doc/plugin/sa-custom-serializer-emoji.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-emoji.png" alt="sa-custom-serializer-emoji.png" />
![sa-custom-serializer-emoji2.png](https://oss.dev33.cn/sa-token/doc/plugin/sa-custom-serializer-emoji2.png 's-w')
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-emoji2.png" alt="sa-custom-serializer-emoji2.png" />

Some files were not shown because too many files have changed in this diff Show More