v.1.30.0 release

This commit is contained in:
click33 2022-05-09 19:05:46 +08:00
parent 3d75eca892
commit be499e011b
28 changed files with 28 additions and 378 deletions

View File

@ -1,7 +1,7 @@
<p align="center">
<img alt="logo" src="https://sa-token.dev33.cn/doc/logo.png" width="150" height="150">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.30.0.RC</h1>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.30.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>
@ -28,64 +28,6 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**`登录认证`**、**`权限认证`**、**`Session会话`**、**`单点登录`**、**`OAuth2.0`**、**`微服务网关鉴权`**
等一系列权限相关问题。
Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证为例,你只需要:
``` java
// 在登录时写入当前会话的账号id
StpUtil.login(10001);
// 然后在需要校验登录处调用以下方法:
// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
StpUtil.checkLogin();
```
至此,我们已经借助 Sa-Token 完成登录认证!
此时的你小脑袋可能飘满了问号,就这么简单?自定义 Realm 呢?全局过滤器呢?我不用写各种配置文件吗?
没错,在 Sa-Token 中登录认证就是如此简单不需要任何的复杂前置工作只需这一行简单的API调用就可以完成会话登录认证
当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后你就会明白相对于这些传统老牌框架Sa-Token 的 API 设计是多么的简单、优雅!
权限认证示例(只有具备 `user:add` 权限的会话才可以进入请求)
``` java
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
// ...
return "用户增加";
}
```
将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常)
``` java
// 将账号id为 10001 的会话踢下线
StpUtil.kickout(10001);
```
在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成:
``` 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 功能一览
- **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录
- **权限认证** —— 权限认证、角色认证、会话二级认证
@ -119,7 +61,7 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
## Sa-Token-SSO 单点登录
网上的单点登录教程大多以CAS流程为主其实对于不同的系统架构实现单点登录的步骤也大为不同Sa-Token由简入难将其划分为三种模式:
Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO 接入问题
| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- |
@ -131,8 +73,6 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
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/index.html#/plugin/alone-redis)
3. 如果既无法做到前端同域也无法做到后端同Redis那么只能走模式三Http请求获取会话Sa-Token对SSO提供了完整的封装你只需要按照示例从文档上复制几段代码便可以轻松集成
4. 技术选型一定要根据系统架构对症下药,切不可胡乱选择
## Sa-Token-OAuth2.0 授权登录
Sa-OAuth2 模块基于 [RFC-6749 标准](https://tools.ietf.org/html/rfc6749) 编写通过Sa-OAuth2你可以非常轻松的实现系统的OAuth2.0授权认证
@ -154,12 +94,6 @@ Sa-OAuth2 模块基于 [RFC-6749 标准](https://tools.ietf.org/html/rfc6749)
![sa-token-rz](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/x/sa-token-rz2.png 's-w')
## Star 趋势
[![giteye-chart](https://chart.giteye.net/gitee/dromara/sa-token/77YQZ6UK.png 'Gitee')](https://giteye.net/chart/77YQZ6UK)
[![github-chart](https://starchart.cc/dromara/sa-token.svg 'GitHub')](https://starchart.cc/dromara/sa-token)
## 使用Sa-Token的开源项目
- [[ sa-plus ]](https://gitee.com/click33/sa-plus):一个基于 SpringBoot 架构的快速开发框架,内置代码生成器
@ -201,11 +135,6 @@ Sa-OAuth2 模块基于 [RFC-6749 标准](https://tools.ietf.org/html/rfc6749)
- [[ TLog ]](https://gitee.com/dromara/TLog):一个轻量级的分布式日志标记追踪神器
## 贡献者名单
感谢每一个为 Sa-Token 贡献代码的小伙伴
[![Giteye chart](https://chart.giteye.net/gitee/dromara/sa-token/CGZ7GT8E.png)](https://giteye.net/chart/CGZ7GT8E)
## 交流群
QQ交流群1群1002350610 (已满) 、

View File

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

View File

@ -1,54 +0,0 @@
//package cn.dev33.satoken.action;
//
//import java.lang.reflect.AnnotatedElement;
//import java.lang.reflect.Method;
//import java.util.List;
//
//import cn.dev33.satoken.session.SaSession;
//
///**
// * <h1> v1.27+ 此接口已废弃目前版本暂时向下兼容请及时更换为 SaStrategy </h1>
// * <p>Sa-Token 逻辑代理接口 </p>
// * <p>此接口将会代理框架内部的一些关键性逻辑方便开发者进行按需重写</p>
// * @author kong
// *
// */
//@Deprecated
//public interface SaTokenAction {
//
// /**
// * 创建一个Token
// * @param loginId 账号id
// * @param loginType 账号类型
// * @return token
// */
// public String createToken(Object loginId, String loginType);
//
// /**
// * 创建一个Session
// * @param sessionId Session的Id
// * @return 创建后的Session
// */
// public SaSession createSession(String sessionId);
//
// /**
// * 判断集合中是否包含指定元素模糊匹配
// * @param list 集合
// * @param element 元素
// * @return 是否包含
// */
// public boolean hasElement(List<String> list, String element);
//
// /**
// * 对一个Method对象进行注解检查注解鉴权内部实现
// * @param method Method对象
// */
// public void checkMethodAnnotation(Method method);
//
// /**
// * 从指定元素校验注解
// * @param target /
// */
// public void validateAnnotation(AnnotatedElement target);
//
//}

View File

@ -1,150 +0,0 @@
//package cn.dev33.satoken.action;
//
//import java.lang.reflect.AnnotatedElement;
//import java.lang.reflect.Method;
//import java.util.List;
//import java.util.UUID;
//
//import cn.dev33.satoken.SaManager;
//import cn.dev33.satoken.annotation.SaCheckBasic;
//import cn.dev33.satoken.annotation.SaCheckLogin;
//import cn.dev33.satoken.annotation.SaCheckPermission;
//import cn.dev33.satoken.annotation.SaCheckRole;
//import cn.dev33.satoken.annotation.SaCheckSafe;
//import cn.dev33.satoken.basic.SaBasicUtil;
//import cn.dev33.satoken.session.SaSession;
//import cn.dev33.satoken.strategy.SaStrategy;
//import cn.dev33.satoken.util.SaFoxUtil;
//import cn.dev33.satoken.util.SaTokenConsts;
//
///**
// * <h1> v1.27+ 此接口已废弃目前版本暂时向下兼容请及时更换为 SaStrategy </h1>
// * <p> Sa-Token 逻辑代理接口 [默认实现类] </p>
// * @author kong
// *
// */
//@Deprecated
//public class SaTokenActionDefaultImpl implements SaTokenAction {
//
// /**
// * 创建一个Token
// */
// @Override
// public String createToken(Object loginId, String loginType) {
// // 根据配置的tokenStyle生成不同风格的token
// String tokenStyle = SaManager.getConfig().getTokenStyle();
// // uuid
// if(SaTokenConsts.TOKEN_STYLE_UUID.equals(tokenStyle)) {
// return UUID.randomUUID().toString();
// }
// // 简单uuid (不带下划线)
// if(SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID.equals(tokenStyle)) {
// return UUID.randomUUID().toString().replaceAll("-", "");
// }
// // 32位随机字符串
// if(SaTokenConsts.TOKEN_STYLE_RANDOM_32.equals(tokenStyle)) {
// return SaFoxUtil.getRandomString(32);
// }
// // 64位随机字符串
// if(SaTokenConsts.TOKEN_STYLE_RANDOM_64.equals(tokenStyle)) {
// return SaFoxUtil.getRandomString(64);
// }
// // 128位随机字符串
// if(SaTokenConsts.TOKEN_STYLE_RANDOM_128.equals(tokenStyle)) {
// return SaFoxUtil.getRandomString(128);
// }
// // tik风格 (2_14_16)
// if(SaTokenConsts.TOKEN_STYLE_TIK.equals(tokenStyle)) {
// return SaFoxUtil.getRandomString(2) + "_" + SaFoxUtil.getRandomString(14) + "_" + SaFoxUtil.getRandomString(16) + "__";
// }
// // 默认还是uuid
// return UUID.randomUUID().toString();
// }
//
// /**
// * 创建一个Session
// */
// @Override
// public SaSession createSession(String sessionId) {
// return new SaSession(sessionId);
// }
//
// /**
// * 判断集合中是否包含指定元素模糊匹配
// */
// @Override
// public boolean hasElement(List<String> list, String element) {
//
// // 空集合直接返回false
// if(list == null || list.size() == 0) {
// return false;
// }
//
// // 先尝试一下简单匹配如果可以匹配成功则无需继续模糊匹配
// if (list.contains(element)) {
// return true;
// }
//
// // 开始模糊匹配
// for (String patt : list) {
// if(SaFoxUtil.vagueMatch(patt, element)) {
// return true;
// }
// }
//
// // 走出for循环说明没有一个元素可以匹配成功
// return false;
// }
//
// /**
// * 对一个Method对象进行注解检查注解鉴权内部实现
// */
// @Override
// public void checkMethodAnnotation(Method method) {
//
// // 先校验 Method 所属 Class 上的注解
// validateAnnotation(method.getDeclaringClass());
//
// // 再校验 Method 上的注解
// validateAnnotation(method);
// }
//
// /**
// * 从指定元素校验注解
// * @param target see note
// */
// public void validateAnnotation(AnnotatedElement target) {
//
// // 校验 @SaCheckLogin 注解
// SaCheckLogin checkLogin = (SaCheckLogin) SaStrategy.me.getAnnotation.apply(target, SaCheckLogin.class);
// if(checkLogin != null) {
// SaManager.getStpLogic(checkLogin.type()).checkByAnnotation(checkLogin);
// }
//
// // 校验 @SaCheckRole 注解
// SaCheckRole checkRole = (SaCheckRole) SaStrategy.me.getAnnotation.apply(target, SaCheckRole.class);
// if(checkRole != null) {
// SaManager.getStpLogic(checkRole.type()).checkByAnnotation(checkRole);
// }
//
// // 校验 @SaCheckPermission 注解
// SaCheckPermission checkPermission = (SaCheckPermission) SaStrategy.me.getAnnotation.apply(target, SaCheckPermission.class);
// if(checkPermission != null) {
// SaManager.getStpLogic(checkPermission.type()).checkByAnnotation(checkPermission);
// }
//
// // 校验 @SaCheckSafe 注解
// SaCheckSafe checkSafe = (SaCheckSafe) SaStrategy.me.getAnnotation.apply(target, SaCheckSafe.class);
// if(checkSafe != null) {
// SaManager.getStpLogic(checkSafe.type()).checkByAnnotation(checkSafe);
// }
//
// // 校验 @SaCheckBasic 注解
// SaCheckBasic checkBasic = (SaCheckBasic) SaStrategy.me.getAnnotation.apply(target, SaCheckBasic.class);
// if(checkBasic != null) {
// SaBasicUtil.check(checkBasic.realm(), checkBasic.account());
// }
//
// }
//
//}

View File

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

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

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

View File

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

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -9,7 +9,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -17,7 +17,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -1,62 +0,0 @@
package com.pj;
import org.springframework.stereotype.Component;
import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.SaLoginModel;
/**
* 自定义侦听器的实现
*/
@Component
public class MySaTokenListener implements SaTokenListener {
/** 每次登录时触发 */
@Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) {
// ...
}
/** 每次注销时触发 */
@Override
public void doLogout(String loginType, Object loginId, String tokenValue) {
// ...
}
/** 每次被踢下线时触发 */
@Override
public void doKickout(String loginType, Object loginId, String tokenValue) {
// ...
}
/** 每次被顶下线时触发 */
@Override
public void doReplaced(String loginType, Object loginId, String tokenValue) {
// ...
}
/** 每次被封禁时触发 */
@Override
public void doDisable(String loginType, Object loginId, long disableTime) {
// ...
}
/** 每次被解封时触发 */
@Override
public void doUntieDisable(String loginType, Object loginId) {
// ...
}
/** 每次创建Session时触发 */
@Override
public void doCreateSession(String id) {
// ...
}
/** 每次注销Session时触发 */
@Override
public void doLogoutSession(String id) {
// ...
}
}

View File

@ -17,7 +17,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -16,7 +16,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -17,7 +17,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -17,7 +17,7 @@
<!-- 定义sa-token版本号 -->
<properties>
<sa-token-version>1.30.0.RC</sa-token-version>
<sa-token-version>1.30.0</sa-token-version>
</properties>
<dependencies>

View File

@ -1,7 +1,7 @@
<p align="center">
<img alt="logo" src="https://sa-token.dev33.cn/doc/logo.png" width="150" height="150">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.30.0.RC</h1>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.30.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>
@ -122,10 +122,6 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
<p class="un-dec-a-pre"></p>
[![giteye-chart](https://chart.giteye.net/gitee/dromara/sa-token/77YQZ6UK.png 'Gitee')](https://giteye.net/chart/77YQZ6UK)
<p class="un-dec-a-pre"></p>
[![github-chart](https://starchart.cc/dromara/sa-token.svg 'GitHub')](https://starchart.cc/dromara/sa-token)
如果 Sa-Token 帮助到了您,希望您可以为其点上一个 `star`
@ -133,19 +129,10 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
[GitHub](https://github.com/dromara/sa-token)
## 使用Sa-Token的开源项目
参考:[Sa-Token 生态](/more/link)
## 贡献者名单
感谢每一个为 Sa-Token 贡献代码的小伙伴
<p class="un-dec-a-pre"></p>
[![Giteye chart](https://chart.giteye.net/gitee/dromara/sa-token/CGZ7GT8E.png)](https://giteye.net/chart/CGZ7GT8E)
## 交流群
QQ交流群1群1002350610 (已满) 、
2群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=b759RZrL)

View File

@ -20,7 +20,7 @@
<div class="logo-box">
<img src="logo.png" title="logo" />
<h1 class="logo-text">Sa-Token</h1>
<sub>v1.30.0.RC</sub>
<sub>v1.30.0</sub>
</div>
</a>
</div>
@ -114,7 +114,7 @@
<!-- -->
<script src="./lib/docsify-plugin.js"></script>
<script>
var saTokenTopVersion = '1.30.0.RC'; // Sa-Token最新版本
var saTokenTopVersion = '1.30.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 = {

View File

@ -1,7 +1,7 @@
# 更新日志
### 2022-05-01 @v1.30.0
### 2022-05-9 @v1.30.0
- 新增:新增集成 Web-Socket 鉴权示例。 **[重要]**
- 新增:新增集成 Web-SocketSpring封装版 鉴权示例。
- 新增:新增 jfinal 集成包 `sa-token-jfinal-plugin` **[重要]**

View File

@ -23,7 +23,7 @@
<img src="./doc/logo.png" title="logo" />
<span class="logo-text">Sa-Token</span>
<!-- <h1 class="logo-text">Sa-Token</h1> -->
<!-- <sub>v1.30.0.RC</sub> -->
<!-- <sub>v1.30.0</sub> -->
</div>
</a>
</div>
@ -69,7 +69,7 @@
<div class="main-box">
<div class="content-box">
<div class="fenge"></div>
<h1>Sa-Token<small>v1.30.0.RC</small></h1>
<h1>Sa-Token<small>v1.30.0</small></h1>
<div class="sub-title">一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!</div>
<div class="btn-box">
<a href="https://github.com/dromara/sa-token" target="_blank">GitHub</a>