优化文档..

This commit is contained in:
click33 2022-10-21 11:27:29 +08:00
parent fe9aebc5cf
commit 6592b62523
45 changed files with 167 additions and 159 deletions

View File

@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交: 请在以下地址复制 issue 模板进行提交:
https://sa-token.dev33.cn/doc.html#/fun/issue-template https://sa-token.cc/doc.html#/fun/issue-template

View File

@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交: 请在以下地址复制 issue 模板进行提交:
https://sa-token.dev33.cn/doc.html#/fun/issue-template https://sa-token.cc/doc.html#/fun/issue-template

View File

@ -1,5 +1,5 @@
<p align="center"> <p align="center">
<img alt="logo" src="https://sa-token.dev33.cn/logo.png" width="150" height="150"> <img alt="logo" src="https://sa-token.cc/logo.png" width="150" height="150">
</p> </p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.31.0</h1> <h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.31.0</h1>
<h4 align="center">一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h4> <h4 align="center">一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h4>
@ -16,7 +16,7 @@
--- ---
## 前言: ## 前言:
- [在线文档http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) - [在线文档https://sa-token.cc](https://sa-token.cc)
- 注:学习测试请拉取 master 分支dev 为正在开发的分支,有很多特性并不稳定。 - 注:学习测试请拉取 master 分支dev 为正在开发的分支,有很多特性并不稳定。
@ -27,26 +27,33 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架主要解决登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 **Sa-Token** 是一个轻量级 Java 权限认证框架主要解决登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
登录认证示例 Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要
``` java ``` java
// 会话登录参数指定在当前客户端登录的账号id // 会话登录参数填登录人的账号id
StpUtil.login(10001); StpUtil.login(10001);
// 会话校验:在需要校验登录处调用以下方法,如果会话未登录会抛出 `NotLoginException` 异常
StpUtil.checkLogin();
// 会话注销:在当前客户端退出已登录的会话
StpUtil.logout();
``` ```
踢人下线: 无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
如果一个接口需要登录后才能访问,我们只需调用以下代码:
``` java
// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
StpUtil.checkLogin();
```
在 Sa-Token 中,大多数功能都可以一行代码解决:
踢人下线示例:
``` java ``` java
// 将账号id为 10077 的会话踢下线 // 将账号id为 10077 的会话踢下线
StpUtil.kickout(10077); StpUtil.kickout(10077);
``` ```
权限认证示例: 权限认证:
``` java ``` java
// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法 // 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add") @SaCheckPermission("user:add")
@ -70,6 +77,8 @@ registry.addInterceptor(new SaInterceptor(handler -> {
})).addPathPatterns("/**"); })).addPathPatterns("/**");
``` ```
当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后你就会明白相对于这些传统老牌框架Sa-Token 的 API 设计是多么的简单、优雅!
## Sa-Token 功能模块一览 ## Sa-Token 功能模块一览
@ -115,13 +124,13 @@ Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO
| 系统架构 | 采用模式 | 简介 | 文档链接 | | 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- | | :-------- | :-------- | :-------- | :-------- |
| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) | | 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) | | 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) | | 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com` 1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com`
2. 后端同Redis就是指多个系统可以连接同一个Redis。PS这里并不需要把所有项目的数据都放在同一个Redis中Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](http://sa-token.dev33.cn/doc.html#/plugin/alone-redis) 2. 后端同Redis就是指多个系统可以连接同一个Redis。PS这里并不需要把所有项目的数据都放在同一个Redis中Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](https://sa-token.cc/doc.html#/plugin/alone-redis)
3. 如果既无法做到前端同域也无法做到后端同Redis那么只能走模式三Http请求获取会话Sa-Token对SSO提供了完整的封装你只需要按照示例从文档上复制几段代码便可以轻松集成 3. 如果既无法做到前端同域也无法做到后端同Redis那么只能走模式三Http请求获取会话Sa-Token对SSO提供了完整的封装你只需要按照示例从文档上复制几段代码便可以轻松集成
## Sa-Token-OAuth2 授权认证 ## Sa-Token-OAuth2 授权认证
@ -134,7 +143,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求
| 密码式Password | Client直接拿着用户的账号密码换取授权 Token | | 密码式Password | Client直接拿着用户的账号密码换取授权 Token |
| 客户端凭证Client Credentials| Server 端针对 Client 级别的 Token代表应用自身的资源授权 | | 客户端凭证Client Credentials| Server 端针对 Client 级别的 Token代表应用自身的资源授权 |
详细参考文档:[http://sa-token.dev33.cn/doc.html#/oauth2/readme](http://sa-token.dev33.cn/doc.html#/oauth2/readme) 详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme)
## 使用 Sa-Token 的开源项目 ## 使用 Sa-Token 的开源项目

View File

@ -5,7 +5,7 @@ import java.io.Serializable;
/** /**
* Sa-Token 配置类 Model * Sa-Token 配置类 Model
* <p> * <p>
* 你可以通过ymlpropertiesjava代码等形式配置本类参数具体请查阅官方文档: http://sa-token.dev33.cn/ * 你可以通过ymlpropertiesjava代码等形式配置本类参数具体请查阅官方文档: https://sa-token.cc/
* *
* @author kong * @author kong
* *

View File

@ -30,7 +30,7 @@ public class SaTokenConsts {
/** /**
* Sa-Token 开发文档地址 * Sa-Token 开发文档地址
*/ */
public static final String DEV_DOC_URL = "http://sa-token.dev33.cn"; public static final String DEV_DOC_URL = "https://sa-token.cc";
// =================== 常量key标记 =================== // =================== 常量key标记 ===================

View File

@ -31,7 +31,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -32,7 +32,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -28,7 +28,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -91,7 +91,7 @@
<br><br> <br><br>
<span>更多资料请参考 Sa-Token 官方文档地址:</span> <span>更多资料请参考 Sa-Token 官方文档地址:</span>
<a href="http://sa-token.dev33.cn/">http://sa-token.dev33.cn/</a> <a href="https://sa-token.cc/">https://sa-token.cc/</a>
<div style="height: 200px;"></div> <div style="height: 200px;"></div>
</div> </div>

View File

@ -28,7 +28,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -21,7 +21,7 @@
<version>1.10.4</version> <version>1.10.4</version>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-solon-plugin</artifactId> <artifactId>sa-token-solon-plugin</artifactId>

View File

@ -32,7 +32,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -32,7 +32,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -98,5 +98,5 @@ function getParam(name, defaultValue){
} }
// 打印信息 // 打印信息
var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str); console.log(str);

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){
$("[name=name]").focus(); $("[name=name]").focus();
// 打印信息 // 打印信息
var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str); console.log(str);

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -27,7 +27,7 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -32,7 +32,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -2,7 +2,7 @@
server: server:
port: 8081 port: 8081
# sa-token配置 ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token: sa-token:
# token名称 (同时也是cookie名称) # token名称 (同时也是cookie名称)
token-name: satoken token-name: satoken

View File

@ -37,7 +37,7 @@
<artifactId>spring-boot-starter-thymeleaf</artifactId> <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -31,7 +31,7 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证Reactor响应式集成, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>

View File

@ -38,7 +38,7 @@
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -38,7 +38,7 @@
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc/ -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>

View File

@ -1,5 +1,5 @@
<p align="center"> <p align="center">
<img alt="logo" src="https://sa-token.dev33.cn/logo.png" width="150" height="150"> <img alt="logo" src="https://sa-token.cc/logo.png" width="150" height="150">
</p> </p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.31.0</h1> <h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.31.0</h1>
<h5 align="center">一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h5> <h5 align="center">一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!</h5>
@ -16,7 +16,7 @@
--- ---
## 前言:️️ ## 前言:️️
为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) 为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[https://sa-token.cc](https://sa-token.cc)
建议收藏在浏览器书签,如果您已经身处本网站下,则请忽略此条说明。 建议收藏在浏览器书签,如果您已经身处本网站下,则请忽略此条说明。
本文档将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 `Sa-Token` 框架本身,更是绝大多数场景下权限设计的最佳实践。 本文档将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 `Sa-Token` 框架本身,更是绝大多数场景下权限设计的最佳实践。
@ -27,71 +27,68 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权** **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权**
等一系列权限相关问题。 等一系列权限相关问题。
Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证为例,你只需要: Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
``` java ``` java
// 在登录时写入当前会话的账号id // 会话登录,参数填登录人的账号id
StpUtil.login(10001); StpUtil.login(10001);
```
// 然后在需要校验登录处调用以下方法: 无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
如果一个接口需要登录后才能访问,我们只需调用以下代码:
``` java
// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
StpUtil.checkLogin(); StpUtil.checkLogin();
``` ```
至此,我们已经借助 Sa-Token 完成登录认证! 在 Sa-Token 中,大多数功能都可以一行代码解决:
此时的你小脑袋可能飘满了问号,就这么简单?自定义 Realm 呢?全局过滤器呢?我不用写各种配置文件吗? 踢人下线示例:
没错,在 Sa-Token 中登录认证就是如此简单不需要任何的复杂前置工作只需这一行简单的API调用就可以完成会话登录认证
当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后你就会明白相对于这些传统老牌框架Sa-Token 的 API 设计是多么的简单、优雅!
权限认证示例(只有具备 `user:add` 权限的会话才可以进入请求)
``` java ``` java
// 将账号id为 10077 的会话踢下线
StpUtil.kickout(10077);
```
权限认证:
``` java
// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add") @SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) { public String insert(SysUser user) {
// ... // ...
return "用户增加"; return "用户增加";
} }
``` ```
将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常) 路由拦截鉴权:
``` java ``` java
// 将账号id为 10001 的会话踢下线 // 根据路由划分模块,不同模块不同鉴权
StpUtil.kickout(10001); registry.addInterceptor(new SaInterceptor(handler -> {
SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
// 更多模块...
})).addPathPatterns("/**");
``` ```
在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成: 当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后你就会明白相对于这些传统老牌框架Sa-Token 的 API 设计是多么的简单、优雅!
``` java
StpUtil.login(10001); // 标记当前会话登录的账号id
StpUtil.getLoginId(); // 获取当前会话登录的账号id
StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false
StpUtil.logout(); // 当前会话注销登录
StpUtil.kickout(10001); // 将账号为10001的会话踢下线
StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false
StpUtil.getSession(); // 获取当前账号id的Session
StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session
StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值
StpUtil.login(10001, "PC"); // 指定设备类型登录,常用于“同端互斥登录”
StpUtil.kickout(10001, "PC"); // 指定账号指定设备类型踢下线 (不同端不受影响)
StpUtil.openSafe(120); // 在当前会话开启二级认证有效期为120秒
StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常
StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
```
即使不运行测试,相信您也能意会到绝大多数 API 的用法。
## Sa-Token 功能一览 ## Sa-Token 功能一览
Sa-Token 目前主要五大功能模块登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。
- **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录 - **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录
- **权限认证** —— 权限认证、角色认证、会话二级认证 - **权限认证** —— 权限认证、角色认证、会话二级认证
- **Session会话** —— 全端共享Session、单端独享Session、自定义Session - **Session会话** —— 全端共享Session、单端独享Session、自定义Session
- **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线 - **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线
- **账号封禁** —— 指定天数封禁、永久封禁、设定解封时间 - **账号封禁** —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁
- **持久层扩展** —— 可集成Redis、Memcached等专业缓存中间件重启数据不丢失 - **持久层扩展** —— 可集成Redis、Memcached等专业缓存中间件重启数据不丢失
- **分布式会话** —— 提供jwt集成、共享数据中心两种分布式会话方案 - **分布式会话** —— 提供jwt集成、共享数据中心两种分布式会话方案
- **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证 - **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证
@ -100,13 +97,13 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
- **二级认证** —— 在已登录的基础上再次认证,保证安全性 - **二级认证** —— 在已登录的基础上再次认证,保证安全性
- **Basic认证** —— 一行代码接入 Http Basic 认证 - **Basic认证** —— 一行代码接入 Http Basic 认证
- **独立Redis** —— 将权限缓存与业务缓存分离 - **独立Redis** —— 将权限缓存与业务缓存分离
- **临时Token证** —— 解决短时间的Token授权问题 - **临时Token证** —— 解决短时间的Token授权问题
- **模拟他人账号** —— 实时操作任意用户状态数据 - **模拟他人账号** —— 实时操作任意用户状态数据
- **临时身份切换** —— 将会话身份临时切换为其它账号 - **临时身份切换** —— 将会话身份临时切换为其它账号
- **前后台分离** —— APP、小程序等不支持Cookie的终端 - **前后台分离** —— APP、小程序等不支持Cookie的终端
- **同端互斥登录** —— 像QQ一样手机电脑同时在线但是两个手机上互斥登录 - **同端互斥登录** —— 像QQ一样手机电脑同时在线但是两个手机上互斥登录
- **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权 - **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权
- **花式token生成** —— 内置六种Token风格还可自定义Token生成策略、自定义Token前缀 - **Token风格定制** —— 内置六种Token风格还可自定义Token生成策略、自定义Token前缀
- **注解式鉴权** —— 优雅的将鉴权与业务代码分离 - **注解式鉴权** —— 优雅的将鉴权与业务代码分离
- **路由拦截式鉴权** —— 根据路由拦截鉴权可适配restful模式 - **路由拦截式鉴权** —— 根据路由拦截鉴权可适配restful模式
- **自动续签** —— 提供两种Token过期策略灵活搭配使用还可自动续签 - **自动续签** —— 提供两种Token过期策略灵活搭配使用还可自动续签
@ -117,6 +114,10 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
- **开箱即用** —— 提供SpringMVC、WebFlux等常见web框架starter集成包真正的开箱即用 - **开箱即用** —— 提供SpringMVC、WebFlux等常见web框架starter集成包真正的开箱即用
- **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流 - **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流
功能结构图:
![sa-token-js](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/x/sa-token-js4.png 's-w')
## 开源仓库 Star 趋势 ## 开源仓库 Star 趋势
@ -133,6 +134,7 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
参考:[Sa-Token 生态](/more/link) 参考:[Sa-Token 生态](/more/link)
## 交流群 ## 交流群
QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)

View File

@ -246,8 +246,8 @@
<script type="text/javascript"> <script type="text/javascript">
// 预览版提示 // 预览版提示
if(location.host === 'rc.sa-token.dev33.cn') { if(location.host === 'rc.sa-token.cc') {
const newTips = '<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.dev33.cn/" target="_blank">https://sa-token.dev33.cn/</a></b>'; const newTips = '<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.cc/" target="_blank">https://sa-token.cc/</a></b>';
layer.alert(newTips); layer.alert(newTips);
} }
</script> </script>

View File

@ -360,7 +360,7 @@
<a href="https://hutool.cn/" target="_blank"> <a href="https://hutool.cn/" target="_blank">
<img src="https://oss.dev33.cn/sa-token/link/hutool.jpg" msg="🍬小而全的Java工具类库使Java拥有函数式语言般的优雅让Java语言也可以“甜甜的”。"> <img src="https://oss.dev33.cn/sa-token/link/hutool.jpg" msg="🍬小而全的Java工具类库使Java拥有函数式语言般的优雅让Java语言也可以“甜甜的”。">
</a> </a>
<a href="https://sa-token.dev33.cn/" target="_blank"> <a href="https://sa-token.cc/" target="_blank">
<img src="https://oss.dev33.cn/sa-token/link/sa-token.png" msg="一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!"> <img src="https://oss.dev33.cn/sa-token/link/sa-token.png" msg="一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!">
</a> </a>
<a href="https://gitee.com/dromara/hmily" target="_blank"> <a href="https://gitee.com/dromara/hmily" target="_blank">
@ -533,7 +533,7 @@
</style> </style>
<div class="foot-box" id="foot"> <div class="foot-box" id="foot">
<div class="s-width" style="text-align: center;"> <div class="s-width" style="text-align: center;">
Copyright ©2022 Sa-Token java权限认证 | sa-token.dev33.cn | <a href="https://beian.miit.gov.cn/" target="_blank">鲁ICP备18046274号-2</a> Copyright ©2022 Sa-Token java权限认证 | sa-token.cc | <a href="https://beian.miit.gov.cn/" target="_blank">鲁ICP备18046274号-2</a>
</div> </div>
</div> </div>
</div> </div>
@ -655,8 +655,8 @@
<script type="text/javascript"> <script type="text/javascript">
// 预览版提示 // 预览版提示
if(location.host === 'rc.sa-token.dev33.cn') { if(location.host === 'rc.sa-token.cc') {
const newTips = '<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.dev33.cn/" target="_blank">https://sa-token.dev33.cn/</a></b>'; const newTips = '<b>当前文档为RC预览版文档仅做学习测试使用正式项目请使用正式版<a href="https://sa-token.cc/" target="_blank">https://sa-token.cc/</a></b>';
layer.alert(newTips); layer.alert(newTips);
} }
</script> </script>

View File

@ -17,7 +17,7 @@
<!---------------------------- tabs:start ------------------------------> <!---------------------------- tabs:start ------------------------------>
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证Reactor响应式集成, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
@ -37,7 +37,7 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
// Sa-Token 整合 Redis (使用 jackson 序列化方式) // Sa-Token 整合 Redis (使用 jackson 序列化方式)

View File

@ -26,7 +26,7 @@ Sa-Token提供两种解决方案
<!---------------------------- tabs:start ------------------------------> <!---------------------------- tabs:start ------------------------------>
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证Reactor响应式集成, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
@ -46,7 +46,7 @@ Sa-Token提供两种解决方案
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
// Sa-Token 整合 Redis (使用 jackson 序列化方式) // Sa-Token 整合 Redis (使用 jackson 序列化方式)
@ -59,7 +59,7 @@ implementation 'org.apache.commons:commons-pool2'
<!---------------------------- tabs:start ------------------------------> <!---------------------------- tabs:start ------------------------------>
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -79,7 +79,7 @@ implementation 'org.apache.commons:commons-pool2'
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
// Sa-Token 整合 Redis (使用 jackson 序列化方式) // Sa-Token 整合 Redis (使用 jackson 序列化方式)

View File

@ -12,7 +12,7 @@
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -21,7 +21,7 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
``` ```
<!---------------------------- tabs:end ----------------------------> <!---------------------------- tabs:end ---------------------------->
@ -29,7 +29,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
<!---------------------------- tabs:start ------------------------------> <!---------------------------- tabs:start ------------------------------>
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
@ -38,7 +38,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
``` ```
<!---------------------------- tabs:end ------------------------------> <!---------------------------- tabs:end ------------------------------>

View File

@ -16,7 +16,7 @@
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -32,7 +32,7 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
// Sa-Token-OAuth2.0 模块 // Sa-Token-OAuth2.0 模块
@ -154,7 +154,7 @@ public class SaOAuth2ServerApplication {
1、由于暂未搭建Client端我们可以使用Sa-Token官网作为重定向URL进行测试 1、由于暂未搭建Client端我们可以使用Sa-Token官网作为重定向URL进行测试
``` url ``` url
http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-token.dev33.cn/&scope=userinfo http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=https://sa-token.cc&scope=userinfo
``` ```
2、由于首次访问我们在OAuth-Server端暂未登录会被转发到登录视图 2、由于首次访问我们在OAuth-Server端暂未登录会被转发到登录视图

View File

@ -12,7 +12,7 @@
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -52,7 +52,7 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
// Sa-Token 插件整合SSO // Sa-Token 插件整合SSO

View File

@ -73,7 +73,7 @@ sa-token.cookie.domain=stp.com
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -106,7 +106,7 @@ sa-token.cookie.domain=stp.com
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
// Sa-Token 插件整合SSO // Sa-Token 插件整合SSO

View File

@ -72,7 +72,7 @@ sa-token.cookie.domain=stp.com
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -105,7 +105,7 @@ sa-token.cookie.domain=stp.com
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
// Sa-Token 插件整合SSO // Sa-Token 插件整合SSO

View File

@ -12,7 +12,7 @@
<!------------- tab:SpringBoot环境 ServletAPI -------------> <!------------- tab:SpringBoot环境 ServletAPI ------------->
如果你使用的框架基于 ServletAPI 构建( SpringMVC、SpringBoot等 ),请引入此包 如果你使用的框架基于 ServletAPI 构建( SpringMVC、SpringBoot等 ),请引入此包
``` xml ``` xml
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -23,7 +23,7 @@
<!------------- tab:WebFlux环境 Reactor -------------> <!------------- tab:WebFlux环境 Reactor ------------->
注:如果你使用的框架基于 Reactor 模型构建Netty、WebFlux、ShenYu、SC Gateway等请引入此包 注:如果你使用的框架基于 Reactor 模型构建Netty、WebFlux、ShenYu、SC Gateway等请引入此包
``` xml ``` xml
<!-- Sa-Token 权限认证Reactor响应式集成, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
@ -34,7 +34,7 @@
<!------------- tab:Solon 集成 -------------> <!------------- tab:Solon 集成 ------------->
参考:[Solon官网](https://solon.noear.org/) 参考:[Solon官网](https://solon.noear.org/)
``` xml ``` xml
<!-- Sa-Token 整合 Solon, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 整合 Solon, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-solon-plugin</artifactId> <artifactId>sa-token-solon-plugin</artifactId>
@ -45,7 +45,7 @@
<!------------- tab:JFinal 集成 -------------> <!------------- tab:JFinal 集成 ------------->
参考:[JFinal官网](https://jfinal.com/) 参考:[JFinal官网](https://jfinal.com/)
``` xml ``` xml
<!-- Sa-Token 整合 JFinal, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 整合 JFinal, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-jfinal-plugin</artifactId> <artifactId>sa-token-jfinal-plugin</artifactId>
@ -56,7 +56,7 @@
<!------------- tab:Jboot 集成 -------------> <!------------- tab:Jboot 集成 ------------->
参考:[Jboot官网](http://www.jboot.com.cn/) 参考:[Jboot官网](http://www.jboot.com.cn/)
``` xml ``` xml
<!-- Sa-Token 整合 Jboot, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 整合 Jboot, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-jboot-plugin</artifactId> <artifactId>sa-token-jboot-plugin</artifactId>
@ -67,7 +67,7 @@
<!------------- tab:Quarkus 集成 -------------> <!------------- tab:Quarkus 集成 ------------->
参考:[quarkus-sa-token](https://github.com/quarkiverse/quarkus-sa-token) 参考:[quarkus-sa-token](https://github.com/quarkiverse/quarkus-sa-token)
``` xml ``` xml
<!-- Sa-Token 整合 Quarkus, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 整合 Quarkus, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>io.quarkiverse.satoken</groupId> <groupId>io.quarkiverse.satoken</groupId>
<artifactId>quarkus-satoken-resteasy</artifactId> <artifactId>quarkus-satoken-resteasy</artifactId>
@ -78,7 +78,7 @@
<!------------- tab:裸Servlet容器环境 -------------> <!------------- tab:裸Servlet容器环境 ------------->
如果你的项目没有使用Spring但是Web框架是基于 ServletAPI 规范的,可以引入此包 如果你的项目没有使用Spring但是Web框架是基于 ServletAPI 规范的,可以引入此包
``` xml ``` xml
<!-- Sa-Token 权限认证ServletAPI规范, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证ServletAPI规范, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-servlet</artifactId> <artifactId>sa-token-servlet</artifactId>
@ -90,7 +90,7 @@
<!------------- tab:其它 -------------> <!------------- tab:其它 ------------->
注:如果你的项目既没有使用 SpringMVC、WebFlux也不是基于 ServletAPI 规范那么可以引入core核心包 注:如果你的项目既没有使用 SpringMVC、WebFlux也不是基于 ServletAPI 规范那么可以引入core核心包
``` xml ``` xml
<!-- Sa-Token 权限认证core核心包, 在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证core核心包, 在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId> <artifactId>sa-token-core</artifactId>
@ -152,7 +152,7 @@ implementation 'cn.dev33:sa-token-core:${sa.top.version}'
## 测试版 ## 测试版
更多内测版本了解:[Sa-Token 最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) 更多内测版本了解:[Sa-Token 最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md)
Maven依赖一直无法加载成功[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) Maven依赖一直无法加载成功[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
## jar包下载 ## jar包下载
[点击下载sa-token-1.6.0.jar](https://oss.dev33.cn/sa-token/sa-token-1.6.0.jar) [点击下载sa-token-1.6.0.jar](https://oss.dev33.cn/sa-token/sa-token-1.6.0.jar)

View File

@ -16,7 +16,7 @@
<!---------------------------- tabs:start ----------------------------> <!---------------------------- tabs:start ---------------------------->
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
@ -25,16 +25,15 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
``` ```
<!---------------------------- tabs:end ----------------------------> <!---------------------------- tabs:end ---------------------------->
Maven依赖一直无法加载成功[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) 更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md)
Maven依赖一直无法加载成功[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull)
### 3、设置配置文件 ### 3、设置配置文件
你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架: 你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架:
@ -46,7 +45,7 @@ server:
# 端口 # 端口
port: 8081 port: 8081
############## Sa-Token 配置 ############## ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token: sa-token:
# token名称 (同时也是cookie名称) # token名称 (同时也是cookie名称)
token-name: satoken token-name: satoken
@ -69,7 +68,7 @@ sa-token:
# 端口 # 端口
server.port=8081 server.port=8081
############## Sa-Token 配置 ############## ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称 (同时也是cookie名称) # token名称 (同时也是cookie名称)
sa-token.token-name=satoken sa-token.token-name=satoken

View File

@ -1,6 +1,6 @@
# Sa-Token 最新版本 # Sa-Token 最新版本
在线文档:[https://sa-token.dev33.cn/](https://sa-token.dev33.cn/) 在线文档:[https://sa-token.cc/](https://sa-token.cc/)
--- ---
@ -16,7 +16,7 @@ v1.31.0 正式版,可上生产:
</dependency> </dependency>
``` ```
Maven依赖一直无法加载成功[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) Maven依赖一直无法加载成功[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
--- ---

View File

@ -19,7 +19,7 @@
<!---------------------------- tabs:start ------------------------------> <!---------------------------- tabs:start ------------------------------>
<!-------- tab:Maven 方式 --------> <!-------- tab:Maven 方式 -------->
``` xml ``` xml
<!-- Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ --> <!-- Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
@ -28,7 +28,7 @@
``` ```
<!-------- tab:Gradle 方式 --------> <!-------- tab:Gradle 方式 -------->
``` gradle ``` gradle
// Sa-Token 权限认证Reactor响应式集成在线文档http://sa-token.dev33.cn/ // Sa-Token 权限认证Reactor响应式集成在线文档https://sa-token.cc
implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
``` ```
<!---------------------------- tabs:end ------------------------------> <!---------------------------- tabs:end ------------------------------>

View File

@ -10,8 +10,7 @@
<!------------- tab:yaml 风格 -------------> <!------------- tab:yaml 风格 ------------->
``` yaml ``` yaml
############## Sa-Token 配置 ############## ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
############## 在线参考https://sa-token.dev33.cn/doc.html#/use/config ##############
sa-token: sa-token:
# token名称 (同时也是cookie名称) # token名称 (同时也是cookie名称)
token-name: satoken token-name: satoken
@ -31,8 +30,7 @@ sa-token:
<!------------- tab:properties 风格 -------------> <!------------- tab:properties 风格 ------------->
``` properties ``` properties
############## Sa-Token 配置 ############## ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
############## 在线参考https://sa-token.dev33.cn/doc.html#/use/config ##############
# token名称 (同时也是cookie名称) # token名称 (同时也是cookie名称)
sa-token.token-name=satoken sa-token.token-name=satoken

View File

@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){
$("[name=name]").focus(); $("[name=name]").focus();
// 打印信息 // 打印信息
var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str); console.log(str);

View File

@ -16,7 +16,7 @@ public class SaCookieTest {
@Test @Test
public void test() { public void test() {
SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx") SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx")
.setDomain("https://sa-token.dev33.cn/") .setDomain("https://sa-token.cc/")
.setMaxAge(-1) .setMaxAge(-1)
.setPath("/") .setPath("/")
.setSameSite("Lax") .setSameSite("Lax")
@ -25,13 +25,13 @@ public class SaCookieTest {
Assertions.assertEquals(cookie.getName(), "satoken"); Assertions.assertEquals(cookie.getName(), "satoken");
Assertions.assertEquals(cookie.getValue(), "xxxx-xxxx-xxxx-xxxx"); Assertions.assertEquals(cookie.getValue(), "xxxx-xxxx-xxxx-xxxx");
Assertions.assertEquals(cookie.getDomain(), "https://sa-token.dev33.cn/"); Assertions.assertEquals(cookie.getDomain(), "https://sa-token.cc/");
Assertions.assertEquals(cookie.getMaxAge(), -1); Assertions.assertEquals(cookie.getMaxAge(), -1);
Assertions.assertEquals(cookie.getPath(), "/"); Assertions.assertEquals(cookie.getPath(), "/");
Assertions.assertEquals(cookie.getSameSite(), "Lax"); Assertions.assertEquals(cookie.getSameSite(), "Lax");
Assertions.assertEquals(cookie.getHttpOnly(), true); Assertions.assertEquals(cookie.getHttpOnly(), true);
Assertions.assertEquals(cookie.getSecure(), true); Assertions.assertEquals(cookie.getSecure(), true);
Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.dev33.cn/; Path=/; Secure; HttpOnly; sameSite=Lax"); Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.cc/; Path=/; Secure; HttpOnly; sameSite=Lax");
Assertions.assertNotNull(cookie.toString()); Assertions.assertNotNull(cookie.toString());
} }

View File

@ -166,49 +166,49 @@ public class SaFoxUtilTest {
@Test @Test
public void joinParam() { public void joinParam() {
// 参数为空时返回原url // 参数为空时返回原url
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null), "https://sa-token.cc");
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", ""), "https://sa-token.cc");
// url为空时视为空字符串 // url为空时视为空字符串
Assertions.assertEquals(SaFoxUtil.joinParam(null, "id=1"), "?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam(null, "id=1"), "?id=1");
Assertions.assertEquals(SaFoxUtil.joinParam("", "id=1"), "?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("", "id=1"), "?id=1");
// 各种情况的测试 // 各种情况的测试
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id=1"), "https://sa-token.cc?id=1");
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?", "id=1"), "https://sa-token.dev33.cn?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?", "id=1"), "https://sa-token.cc?id=1");
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang", "id=1"), "https://sa-token.cc?name=zhang&id=1");
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id=1"), "https://sa-token.cc?name=zhang&id=1");
// 重载方法测试 // 重载方法测试
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id", 1), "https://sa-token.dev33.cn?name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id", 1), "https://sa-token.cc?name=zhang&id=1");
// url或key为null时不拼接 // url或key为null时不拼接
Assertions.assertEquals(SaFoxUtil.joinParam(null, "id", 1), null); Assertions.assertEquals(SaFoxUtil.joinParam(null, "id", 1), null);
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null, 1), "https://sa-token.cc");
// value为null时会拼接出一个null字符串 // value为null时会拼接出一个null字符串
Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn?id=null"); Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id", null), "https://sa-token.cc?id=null");
} }
@Test @Test
public void joinSharpParam() { public void joinSharpParam() {
// 参数为空时返回原url // 参数为空时返回原url
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null), "https://sa-token.cc");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", ""), "https://sa-token.cc");
// url为空时视为空字符串 // url为空时视为空字符串
Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id=1"), "#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id=1"), "#id=1");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("", "id=1"), "#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("", "id=1"), "#id=1");
// 各种情况的测试 // 各种情况的测试
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id=1"), "https://sa-token.cc#id=1");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#", "id=1"), "https://sa-token.dev33.cn#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#", "id=1"), "https://sa-token.cc#id=1");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang", "id=1"), "https://sa-token.cc#name=zhang&id=1");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id=1"), "https://sa-token.cc#name=zhang&id=1");
// 重载方法测试 // 重载方法测试
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id", 1), "https://sa-token.dev33.cn#name=zhang&id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id", 1), "https://sa-token.cc#name=zhang&id=1");
// url或key为null时不拼接 // url或key为null时不拼接
Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id", 1), null); Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id", 1), null);
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null, 1), "https://sa-token.cc");
// value为null时会拼接出一个null字符串 // value为null时会拼接出一个null字符串
Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn#id=null"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id", null), "https://sa-token.cc#id=null");
} }
@Test @Test
@ -233,7 +233,7 @@ public class SaFoxUtilTest {
@Test @Test
public void isUrl() { public void isUrl() {
Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.dev33.cn")); Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.cc"));
Assertions.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/")); Assertions.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/"));
Assertions.assertFalse(SaFoxUtil.isUrl(null)); Assertions.assertFalse(SaFoxUtil.isUrl(null));
@ -246,8 +246,8 @@ public class SaFoxUtilTest {
@Test @Test
public void encodeUrl() { public void encodeUrl() {
Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.dev33.cn"), "https%3A%2F%2Fsa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.cc"), "https%3A%2F%2Fsa-token.cc");
Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.dev33.cn"), "https://sa-token.dev33.cn"); Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.cc"), "https://sa-token.cc");
} }
@Test @Test