mirror of
https://gitee.com/dromara/sa-token.git
synced 2026-02-27 16:50:24 +08:00
Compare commits
66 Commits
v1.43.0
...
2fc76c767e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fc76c767e | ||
|
|
cefa368f4d | ||
|
|
84795e9014 | ||
|
|
f8d57189e0 | ||
|
|
4cbb0849a7 | ||
|
|
b1723e5424 | ||
|
|
196d34be20 | ||
|
|
ff3ce7daa5 | ||
|
|
f61d8369ac | ||
|
|
a27739f344 | ||
|
|
9378da7a91 | ||
|
|
47e8e91056 | ||
|
|
e7c09e81d7 | ||
|
|
6cd765ce91 | ||
|
|
d646099127 | ||
|
|
5708657f86 | ||
|
|
7e9201584d | ||
|
|
a6a1b9b865 | ||
|
|
4b7e6d651f | ||
|
|
f6d6e50a16 | ||
|
|
fdead8cfa6 | ||
|
|
aa15d56082 | ||
|
|
30ffe1713f | ||
|
|
74db9e997e | ||
|
|
f4fa77edd0 | ||
|
|
2cf899e019 | ||
|
|
c625a29df8 | ||
|
|
39b468b150 | ||
|
|
a16552c3fe | ||
|
|
ed35640765 | ||
|
|
b85b2815ea | ||
|
|
5b8b99e0d0 | ||
|
|
75256e3329 | ||
|
|
43728fb6cc | ||
|
|
a53874025e | ||
|
|
7a63be81d4 | ||
|
|
4a16556a56 | ||
|
|
5051f430c0 | ||
|
|
fa76826ee0 | ||
|
|
622cf3f3b5 | ||
|
|
0bebcd4b02 | ||
|
|
e1f25ccae8 | ||
|
|
ac6f06fb37 | ||
|
|
4036788426 | ||
|
|
b0d42821d7 | ||
|
|
ebc381772f | ||
|
|
d08f93bdc0 | ||
|
|
c2fc4decef | ||
|
|
f7378f3898 | ||
|
|
7bde74bc51 | ||
|
|
5fc40a5af2 | ||
|
|
e13b263f27 | ||
|
|
bd22a94a10 | ||
|
|
be5ee2fc2b | ||
|
|
f4e7dac95f | ||
|
|
e97cddb5e2 | ||
|
|
e80369eb4b | ||
|
|
0cd3d66712 | ||
|
|
923b76a8db | ||
|
|
a6b38430cd | ||
|
|
e2c08f7dd2 | ||
|
|
986111b10c | ||
|
|
2cf18309b2 | ||
|
|
d22ac1b7cf | ||
|
|
fece7081a9 | ||
|
|
dc874c2275 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,5 +14,6 @@ unpackage/
|
||||
.idea/
|
||||
|
||||
sa-token-three-plugin/
|
||||
sa-token-doc/big-file/
|
||||
|
||||
.flattened-pom.xml
|
||||
|
||||
10
README.md
10
README.md
@@ -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、微服务鉴权。
|
||||
|
||||

|
||||

|
||||
|
||||
要在 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 接入问题:
|
||||
|
||||

|
||||

|
||||
|
||||
| 系统架构 | 采用模式 | 简介 | 文档链接 |
|
||||
| :-------- | :-------- | :-------- | :-------- |
|
||||
@@ -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,邀您加入群聊)
|
||||
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
74
sa-token-demo/sa-token-demo-loveqq-boot/pom.xml
Normal file
74
sa-token-demo/sa-token-demo-loveqq-boot/pom.xml
Normal 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>
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
})
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
# 端口
|
||||
k:
|
||||
server:
|
||||
port: 8081
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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(){
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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会话**、**微服务网关鉴权**
|
||||
等一系列权限相关问题。
|
||||
|
||||

|
||||
<!--  -->
|
||||
|
||||
<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 目前主要五大功能模块:登录认证、权限认证、单点
|
||||
|
||||
功能结构图:
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/index/intro/sa-token-js4.png" />
|
||||
|
||||
|
||||
## 开源仓库 Star 趋势
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.cn,url2=/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)
|
||||
|
||||
@@ -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 列表)。
|
||||
|
||||
|
||||
|
||||
|
||||
157
sa-token-doc/arch/dir-intro.md
Normal file
157
sa-token-doc/arch/dir-intro.md
Normal 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 整合 Forest,http 请求处理器
|
||||
├── sa-token-okhttps // [插件] Sa-Token 整合 OkHttps,http 请求处理器
|
||||
├── 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-Socket(Spring封装版) 鉴权示例
|
||||
├── 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 涉及知识点学习。
|
||||
@@ -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">筑梦信仰-joy(20集)</a>
|
||||
<a href="https://www.bilibili.com/video/BV11u4y197JL/" target="_blank">达达-Java(26集)</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>
|
||||
@@ -4,12 +4,12 @@
|
||||
|
||||
### Sa-Token 功能结构图:
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/fun/sa-token-js4--2.png" alt="sa-token-rz" />
|
||||
|
||||
### Sa-Token 认证流程图:
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/fun/sa-token-rz2.png" alt="sa-token-rz" />
|
||||
|
||||
<!--  -->
|
||||
|
||||
PS:鼠标右键选择 **`[在新窗口打开图片]`** 即可高清模式查看图片。(本流程图使用 [ProcessOn](https://www.processon.com) 绘制完成)
|
||||
PS:鼠标右键选择 **`[在新窗口打开图片]`** 即可高清模式查看图片。
|
||||
|
||||
@@ -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)
|
||||
@@ -16,11 +16,11 @@ public String test() {
|
||||
|
||||
从浏览器访问此接口,我们可以看到:
|
||||
|
||||

|
||||
<img class="s-w-sh" src="/big-file/doc/fun/test-curr-domain.png" alt="test-curr-domain.png" />
|
||||
|
||||
此 API 在本地开发时一般可以正常工作,然而如果我们在部署时使用 Nginx 做了一层反向代理后,其最终结果可能会和我们预想的有一点偏差:
|
||||
|
||||

|
||||
<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 代理转发的地方增加参数
|
||||
|
||||

|
||||
<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;`
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
2. 滑动右侧页面滑块, 查看页面内容最下方, 评论区上方
|
||||
3. 找到这一行文字
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/online_1.png" alt="在线编辑提示" />
|
||||
|
||||
4. 点击Gitee或GitHub按钮中的任意一个, 国内用户推荐使用 [Gitee](https://gitee.com) (请先注册登录后再往下浏览)
|
||||
5. 此时会进入当前页面源码预览页面,找到下方按钮组
|
||||
|
||||

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

|
||||
<img src="/big-file/doc/fun/code_1.png" alt="按钮组" />
|
||||
|
||||
3. 选择个人仓库并点击确认
|
||||
4. 此时在你的个人仓库中会多了一个Sa-Token项目
|
||||
5. 在新的Sa-Token项目中, 点击  按钮, 点击弹出框里面的复制按钮
|
||||
5. 在新的Sa-Token项目中, 点击 <img src="/big-file/doc/fun/code_2.png" alt="克隆/下载" /> 按钮, 点击弹出框里面的复制按钮
|
||||
6. 在本地某空文件夹下右键选择: git bash here
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/code_4.png" alt="git bash" />
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/code_3.png" alt="git bash 打开后的图" />
|
||||
|
||||
14. 在里面输入如下命令, 按换行后自动下载整个项目
|
||||
|
||||
@@ -61,18 +61,18 @@ git clone 这里替换为复制后的链接
|
||||
### 方式一
|
||||
1. 在idea中打开项目进入Commit选项
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/code_5.png" alt="本地暂存" />
|
||||
|
||||
2. 勾选需要本地暂存的文件
|
||||
3. 在同一页面的下方输入提示信息
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/code_6.png" alt="提示信息" />
|
||||
|
||||
4. 点击Commit按钮暂存到本地, 点击Commit and Push按钮暂存之后提交到远程
|
||||
### 方式二
|
||||
1. 除了点击Commit and Push按钮外,还有一个地方可以提交git
|
||||
|
||||

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

|
||||
<img src="/big-file/doc/fun/code_8.png" alt="工具栏" />
|
||||
|
||||
3. 点击提交, 进入如下页面
|
||||
|
||||

|
||||
<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项目主页面中, 找到下图的圆圈
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/code_10.png" alt="更新按钮" />
|
||||
|
||||
3. 点击右侧圆圈按钮后Gitee会自动同步主项目, 这样就不用像我之前一样,删除项目又重新fork了.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
解决这个问题的关键就在于 `SaTokenContext` 接口,此接口的作用是屏蔽掉不同 Web 框架之间的差异,提供统一的调用API:
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/fun/sa-token-context.svg" alt="sa-token-context" />
|
||||
|
||||
|
||||
SaTokenContext只是一个接口,没有工作能力,这也就意味着 SaTokenContext 接口的实现是必须的。
|
||||
|
||||
@@ -60,7 +60,7 @@ public static void setContext(HttpServletRequest request, HttpServletResponse re
|
||||
|
||||
Sa-Token 为了一套代码对接所有的 Web 框架,就在原生请求对象的基础上又封装了一层 `SaTokenContext` 相关接口,用于屏蔽掉不同 Web 框架之间的差异,提供统一的调用API:
|
||||
|
||||

|
||||
<img src="/big-file/doc/fun/sa-token-context-2.svg" alt="sa-token-context" />
|
||||
|
||||
因此,要对接不同的 Web 框架,就要针对不同的 Web 框架封装不同版本的 `SaRequest`、`SaResponse`、`SaStorage` 包装类对象。
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ session.updateTimeout(1000); // 参数说明和全局有效期保持一致
|
||||
|
||||
**假设三个客户端登录同一账号,且配置了不共享token,那么此时的Session模型是:**
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/fun/session-model3.png" alt="session-model" />
|
||||
|
||||
简而言之:
|
||||
- `Account-Session` 以账号 id 为主,只要 token 指向的账号 id 一致,那么对应的Session对象就一致
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
|
||||
集成依赖示例:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
|
||||
### 1、加入QQ交流群
|
||||
|
||||
<!--  -->
|
||||
|
||||
<!-- 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、加入微信交流群:
|
||||
|
||||
<!--  -->
|
||||
<!-- <img class="s-w" src="/big-file/contact/wx-qr-300.png" style="width: 180px;" alt="微信群" /> -->
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/contact/i-wx-qr2.jpg" style="width: 180px;" alt="微信群" />
|
||||
|
||||
(扫码添加微信,备注:sa,邀您加入群聊)
|
||||
|
||||
|
||||
@@ -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 进行鉴权。
|
||||
|
||||
@@ -10,7 +10,7 @@ Sa-Token 采用 Apache-2.0 开源协议,**承诺框架本身与官网文档永
|
||||
|
||||
您可以在项目 [Gitee](https://gitee.com/dromara/sa-token) 主页进行捐赠
|
||||
|
||||

|
||||
<!--  -->
|
||||
|
||||
|
||||
|
||||
@@ -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 商业赞助。
|
||||
|
||||
注:在群发消息时,我们会明确对群友声明,此条消息为赞助商的产品,属于硬广信息。如您介意这一点,我们将暂时无法与您合作。
|
||||
|
||||
|
||||
@@ -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) 主页进行捐赠
|
||||
|
||||

|
||||
<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 商业赞助。
|
||||
|
||||
注:在群发消息时,我们会明确对群友声明,此条消息为赞助商的产品,属于硬广信息。如您介意这一点,我们将暂时无法与您合作。
|
||||
|
||||
|
||||
@@ -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` 模块。 **[重要]**
|
||||
|
||||
@@ -33,7 +33,7 @@ public class SaOAuth2DataLoaderImpl implements SaOAuth2DataLoader {
|
||||
|
||||
当不知情的小红被诱导访问了这个 URL 时,它将被重定向至百度首页。
|
||||
|
||||

|
||||
<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 {
|
||||
|
||||
再次访问上述链接:
|
||||
|
||||

|
||||
<img class="s-w-sh" src="/big-file/doc/oauth2-new/oauth2-feifa-rf.png" alt="oauth2-feifa-rf" />
|
||||
|
||||
URL 没有通过校验,拒绝授权!
|
||||
|
||||
|
||||
@@ -117,11 +117,11 @@ public class SaOAuth2ServerH5Controller {
|
||||
|
||||
在前端 ide 中导入 demo 案例的 `sa-token-demo-oauth2-server-h5` 项目,然后直接预览 `oauth2-authorize.html` 页面,如图所示:
|
||||
|
||||

|
||||
<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 授权页地址” 选项中,其它选项保持默认不变:
|
||||
|
||||

|
||||
<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前端测试页” 的页面提示进行测试即可,此处不再赘述。
|
||||
|
||||
|
||||
@@ -227,14 +227,14 @@ http://sa-oauth-server.com:8000/oauth2/authorize?response_type=code&client_id=10
|
||||
|
||||
2、由于首次访问,我们在OAuth-Server端暂未登录,会被转发到登录视图
|
||||
|
||||

|
||||
<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` 进行登录之后,会提示我们确认授权
|
||||

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

|
||||
<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
|
||||
}
|
||||
```
|
||||
|
||||
<!--  -->
|
||||
|
||||
测试完毕
|
||||
|
||||
@@ -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)
|
||||
|
||||

|
||||
<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 四种模式的测试。
|
||||
|
||||

|
||||
<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 四种模式 前端测试页
|
||||
|
||||
@@ -23,7 +23,7 @@ OAuth2.0 与 SSO 相比,增加了对应用授权范围的控制,减弱了应
|
||||
3. 密码式(Password):Client 端直接拿着用户的账号密码换取授权 `Access-Token`。
|
||||
4. 客户端凭证(Client Credentials):Server 端针对 Client 级别的 Token,代表应用自身的资源授权。
|
||||
|
||||

|
||||
<img src="/big-file/doc/oauth2-new/sa-oauth2-setup.png" alt="sa-oauth2-setup.png" />
|
||||
|
||||
接下来我们将通过简单示例演示如何在 Sa-Token-OAuth2 中完成这四种模式的对接: [搭建OAuth2-Server](/oauth2/oauth2-server)
|
||||
|
||||
|
||||
@@ -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中增加的数据
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/plugin/alone-redis.png" alt="alone-redis" />
|
||||
|
||||
测试完毕!
|
||||
|
||||
|
||||
@@ -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) 🔗
|
||||
|
||||

|
||||
<img class="s-w-sh" src="/big-file/doc/plugin/sa-api-key.png" alt="sa-api-key" />
|
||||
|
||||
|
||||
### 1、需求场景
|
||||
|
||||
@@ -34,7 +34,7 @@ public void rewriteComponent() {
|
||||
|
||||
效果图:
|
||||
|
||||

|
||||
<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() {
|
||||
|
||||
效果图:
|
||||
|
||||

|
||||
<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() {
|
||||
|
||||
效果图:
|
||||
|
||||

|
||||
<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() {
|
||||
|
||||
效果图:
|
||||
|
||||

|
||||
<img class="s-w" src="/big-file/doc/plugin/sa-custom-serializer-emoji.png" alt="sa-custom-serializer-emoji.png" />
|
||||
|
||||

|
||||
<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
Reference in New Issue
Block a user