From 2b18084cbcaa3b35cb8c897f08528a9b036d2e70 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 5 Nov 2021 17:25:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=96=B0=E5=A2=9E=EF=BC=9ASa?= =?UTF-8?q?-Token=E6=8F=92=E4=BB=B6=E5=BC=80=E5=8F=91=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/SaTokenContextDefaultImpl.java | 2 +- sa-token-doc/doc/_sidebar.md | 3 +- sa-token-doc/doc/fun/plugin-dev.md | 132 ++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 sa-token-doc/doc/fun/plugin-dev.md diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java index 0fb743b9..07ac66ef 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java @@ -21,7 +21,7 @@ public class SaTokenContextDefaultImpl implements SaTokenContext { /** * 默认的上下文处理器对象 */ - public static SaTokenContextDefaultImpl defaultContext = new SaTokenContextDefaultImpl(); + public static SaTokenContext defaultContext = new SaTokenContextDefaultImpl(); /** * 默认的错误提示语 diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md index f0e3d3eb..3b9f3e56 100644 --- a/sa-token-doc/doc/_sidebar.md +++ b/sa-token-doc/doc/_sidebar.md @@ -66,6 +66,7 @@ - [和 Thymeleaf 集成](/plugin/thymeleaf-extend) - [和 jwt 集成](/plugin/jwt-extend) - [和 Dubbo 集成](/plugin/dubbo-extend) + - [Sa-Token 插件开发指南](/fun/plugin-dev) - **其它** - [更新日志](/more/update-log) @@ -94,5 +95,5 @@ -













+






----- 到底线了 -----

\ No newline at end of file diff --git a/sa-token-doc/doc/fun/plugin-dev.md b/sa-token-doc/doc/fun/plugin-dev.md new file mode 100644 index 00000000..650b34fa --- /dev/null +++ b/sa-token-doc/doc/fun/plugin-dev.md @@ -0,0 +1,132 @@ +# Sa-Token 插件开发指南 + +--- + +插件,从字面意思理解就是可拔插的组件,作用是在不改变 Sa-Token 现有架构的情况下,替换或扩展一部分底层代码逻辑。 + +为 Sa-Token 开发插件非常简单,以下是几种可用的方法: + +- 自定义全局策略。 +- 更改全局组件实现。 +- 实现自定义SaTokenContext。 +- 其它自由扩展。 + +下面依次介绍这几种方式。 + +### 1、自定义全局策略 + +Sa-Token 将框架的一些关键逻辑抽象出一个统一的概念 —— 策略,并统一定义在 `SaStrategy` 中,源码参考:[SaStrategy](https://gitee.com/dromara/sa-token/blob/master/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java) 。 + +SaStrategy 的每一个函数都可以单独重写,以 “自定义Token生成策略” 这一需求为例: + +``` java +// 重写 Token 生成策略 +SaStrategy.me.createToken = (loginId, loginType) -> { + return SaFoxUtil.getRandomString(60); // 随机60位长度字符串 +}; +``` + +就像变量的重新赋值一样,我们只需重新指定一个新的策略函数,即可自定义 Token 生成的逻辑。 + + +### 2、更改全局组件实现 + +Sa-Token 大部分全局组件都定义在 SaManager 之上([SaManager](https://gitee.com/dromara/sa-token/blob/master/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java)), +我们只需要更改组件的实现类即可。以 临时令牌认证 模块举例 + +##### 1、先自定义一个实现类 + +``` java +/** + * 临时认证模块 自定义实现 + */ +public class MySaTemp implements SaTempInterface { + + @Override + public String createToken(Object value, long timeout) { + System.out.println("------- 自定义一些逻辑 createToken "); + return SaTempInterface.super.createToken(value, timeout); + } + + @Override + public Object parseToken(String token) { + System.out.println("------- 自定义一些逻辑 parseToken "); + return SaTempInterface.super.parseToken(token); + } + +} +``` + +##### 2、将自定义实现类绑定在 SaManager 上 +``` java +// 注入 +SaManager.setSaTemp(new MySaTemp()); +``` + +以上是手动注入方式,如果你是 Spring 的 IOC 环境,则直接在 MySaTemp 实现类加上 @Component 注解即可。 + +##### 3、开始测试: + +``` java +// 根据 value 创建一个 token +String token = SaTempUtil.createToken("10014", 120); +System.out.println("生成的Token为:" + token); + +Object value = SaTempUtil.parseToken(token); +System.out.println("将Token解析后的值为:" + value); +``` + +观察控制台输出,检验自定义实现类是否注入成功: + +![dev-plugin-print](https://oss.dev33.cn/sa-token/doc/dev-plugin-print.png) + + +### 3、实现自定义SaTokenContext +SaTokenContext 是对接不同框架的上下文接口,注入流程和第二步类似,篇幅限制,可参考:[自定义 SaTokenContext 指南](/fun/sa-token-context) + + +### 4、其它自由扩展 +这种方式就无需注入什么全局组件替换内部实现了,你可以在 Sa-Token 的基础之上封装任何代码,进行功能扩展。 + + +### 5、练练手 +熟悉了插件开发流程,下面的 [ 待开发插件列表 ] 或许可以给你提供一个练手的方向。 + +##### SaTokenContext 实现: + +| 插件 | 功能 | 状态 | +| :-------- | :-------- | :-------- | +| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 | +| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 待开发 | +| sa-token-hasor-starter | Sa-Token 与 Hasor 的整合 | 待开发 | + +##### 标签方言: + +| 插件 | 功能 | 状态 | +| :-------- | :-------- | :-------- | +| sa-token-dialect-thymeleaf | Sa-Token 与 thymeleaf 的整合 | 已完成 | +| sa-token-dialect-freemarker | Sa-Token 与 freemarker 的整合 | 待开发 | +| sa-token-dialect-jsp | Sa-Token 与 jsp 的整合 | 待开发 | +| sa-token-dialect-velocity | Sa-Token 与 velocity 的整合 | 待开发 | +| sa-token-dialect-beetl | Sa-Token 与 beetl 的整合 | 待开发 | + +##### 持久层扩展: + +| 插件 | 功能 | 状态 | +| :-------- | :-------- | :-------- | +| sa-token-dao-redis | Sa-Token 与 Redis 的整合 | 已完成 | +| sa-token-dao-memcached | Sa-Token 与 memcached 的整合 | 待开发 | + +##### 其它: +任何你认为有价值的功能代码,都可以扩展为插件。 + + +### 6、发布代码 +插件开发完毕之后,你可以将其pr到官方仓库,或: + +上传到 gitee/github 作为独立项目维护,并发布到 Maven 中央仓库,参考这篇:[https://juejin.cn/post/6844904104834105358](https://juejin.cn/post/6844904104834105358) + + + + +