diff --git a/sa-token-bom/pom.xml b/sa-token-bom/pom.xml index 2e092fe7..9cff8a3b 100644 --- a/sa-token-bom/pom.xml +++ b/sa-token-bom/pom.xml @@ -179,6 +179,11 @@ sa-token-oauth2 ${revision} + + cn.dev33 + sa-token-apikey + ${revision} + cn.dev33 sa-token-quick-login diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java index 6e973668..99f54145 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java @@ -15,9 +15,6 @@ */ package cn.dev33.satoken; -import cn.dev33.satoken.apikey.SaApiKeyTemplate; -import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoader; -import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoaderDefaultImpl; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.config.SaTokenConfigFactory; import cn.dev33.satoken.context.SaTokenContext; @@ -310,44 +307,6 @@ public class SaManager { return totpTemplate; } - /** - * ApiKey 数据加载器 - */ - private volatile static SaApiKeyDataLoader apiKeyDataLoader; - public static void setSaApiKeyDataLoader(SaApiKeyDataLoader apiKeyDataLoader) { - SaManager.apiKeyDataLoader = apiKeyDataLoader; - SaTokenEventCenter.doRegisterComponent("SaApiKeyDataLoader", apiKeyDataLoader); - } - public static SaApiKeyDataLoader getSaApiKeyDataLoader() { - if (apiKeyDataLoader == null) { - synchronized (SaManager.class) { - if (apiKeyDataLoader == null) { - SaManager.apiKeyDataLoader = new SaApiKeyDataLoaderDefaultImpl(); - } - } - } - return apiKeyDataLoader; - } - - /** - * ApiKey 操作类 - */ - private volatile static SaApiKeyTemplate apiKeyTemplate; - public static void setSaApiKeyTemplate(SaApiKeyTemplate apiKeyTemplate) { - SaManager.apiKeyTemplate = apiKeyTemplate; - SaTokenEventCenter.doRegisterComponent("SaApiKeyTemplate", apiKeyTemplate); - } - public static SaApiKeyTemplate getSaApiKeyTemplate() { - if (apiKeyTemplate == null) { - synchronized (SaManager.class) { - if (apiKeyTemplate == null) { - SaManager.apiKeyTemplate = new SaApiKeyTemplate(); - } - } - } - return apiKeyTemplate; - } - // ------------------- StpLogic 相关 ------------------- diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java index f781da5e..1b0c4805 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java @@ -78,13 +78,6 @@ public @interface SaCheckOr { */ SaCheckDisable[] disable() default {}; - /** - * 设定 @SaCheckApiKey,参考 {@link SaCheckApiKey} - * - * @return / - */ - SaCheckApiKey[] apikey() default {}; - /** * 需要追加抓取的注解 Class (只能填写 Sa-Token 相关注解类型) * diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java index 0ae13572..5c2566c7 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java @@ -40,7 +40,7 @@ public class SaCheckOrHandler implements SaAnnotationHandlerInterface @Override public void checkMethod(SaCheckOr at, AnnotatedElement element) { - _checkMethod(at.login(), at.role(), at.permission(), at.safe(), at.httpBasic(), at.httpDigest(), at.disable(), at.apikey(), at.append(), element); + _checkMethod(at.login(), at.role(), at.permission(), at.safe(), at.httpBasic(), at.httpDigest(), at.disable(), at.append(), element); } public static void _checkMethod( @@ -51,7 +51,6 @@ public class SaCheckOrHandler implements SaAnnotationHandlerInterface SaCheckHttpBasic[] httpBasic, SaCheckHttpDigest[] httpDigest, SaCheckDisable[] disable, - SaCheckApiKey[] apikey, Class[] append, AnnotatedElement element ) { @@ -64,7 +63,6 @@ public class SaCheckOrHandler implements SaAnnotationHandlerInterface annotationList.addAll(Arrays.asList(disable)); annotationList.addAll(Arrays.asList(httpBasic)); annotationList.addAll(Arrays.asList(httpDigest)); - annotationList.addAll(Arrays.asList(apikey)); for (Class annotationClass : append) { Annotation annotation = SaAnnotationStrategy.instance.getAnnotation.apply(element, annotationClass); if(annotation != null) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 0a6ff227..eccbfb13 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -233,11 +233,6 @@ public class SaTokenConfig implements Serializable { */ public Map signMany = new LinkedHashMap<>(); - /** - * API Key 相关配置 - */ - public SaApiKeyConfig apiKey = new SaApiKeyConfig(); - /** * @return token 名称 (同时也是: cookie 名称、提交 token 时参数的名称、存储 token 时的 key 前缀) */ @@ -902,26 +897,6 @@ public class SaTokenConfig implements Serializable { return this; } - /** - * API Key 相关配置 - * - * @return / - */ - public SaApiKeyConfig getApiKey() { - return this.apiKey; - } - - /** - * 设置 API Key 相关配置 - * - * @param apiKey / - * @return / - */ - public SaTokenConfig setApiKey(SaApiKeyConfig apiKey) { - this.apiKey = apiKey; - return this; - } - @Override public String toString() { @@ -965,7 +940,6 @@ public class SaTokenConfig implements Serializable { + ", cookie=" + cookie + ", sign=" + sign + ", signMany=" + signMany - + ", apiKey=" + apiKey + "]"; } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java index d326e719..51e3d6bc 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java @@ -62,7 +62,6 @@ public final class SaAnnotationStrategy { annotationHandlerMap.put(SaCheckHttpDigest.class, new SaCheckHttpDigestHandler()); annotationHandlerMap.put(SaCheckOr.class, new SaCheckOrHandler()); annotationHandlerMap.put(SaCheckSign.class, new SaCheckSignHandler()); - annotationHandlerMap.put(SaCheckApiKey.class, new SaCheckApiKeyHandler()); } /** diff --git a/sa-token-demo/sa-token-demo-apikey/pom.xml b/sa-token-demo/sa-token-demo-apikey/pom.xml index 07ab947e..b88eaf5c 100644 --- a/sa-token-demo/sa-token-demo-apikey/pom.xml +++ b/sa-token-demo/sa-token-demo-apikey/pom.xml @@ -47,6 +47,13 @@ commons-pool2 + + + cn.dev33 + sa-token-apikey + ${sa-token.version} + + org.springframework.boot diff --git a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/SaTokenApiKeyApplication.java b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/SaTokenApiKeyApplication.java index b5858879..8884c00e 100644 --- a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/SaTokenApiKeyApplication.java +++ b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/SaTokenApiKeyApplication.java @@ -1,6 +1,7 @@ package com.pj; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.apikey.SaApiKeyManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -9,8 +10,9 @@ public class SaTokenApiKeyApplication { public static void main(String[] args) { SpringApplication.run(SaTokenApiKeyApplication.class, args); - System.out.println("\n启动成功,Sa-Token 配置如下:" + SaManager.getConfig()); - System.out.println("\n测试访问:http://localhost:8081/index.html"); + System.out.println("启动成功:Sa-Token 配置如下:" + SaManager.getConfig()); + System.out.println("启动成功:API Key 配置如下:" + SaApiKeyManager.getConfig()); + System.out.println("测试访问:http://localhost:8081/index.html"); } } \ No newline at end of file diff --git a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyController.java b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyController.java index c9eae5fb..a3f6d371 100644 --- a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyController.java +++ b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyController.java @@ -1,7 +1,7 @@ package com.pj.test; -import cn.dev33.satoken.apikey.SaApiKeyUtil; import cn.dev33.satoken.apikey.model.ApiKeyModel; +import cn.dev33.satoken.apikey.template.SaApiKeyUtil; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaResult; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyResourcesController.java b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyResourcesController.java index 8083f128..a5d01cb6 100644 --- a/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyResourcesController.java +++ b/sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyResourcesController.java @@ -1,9 +1,9 @@ package com.pj.test; -import cn.dev33.satoken.annotation.SaCheckApiKey; import cn.dev33.satoken.annotation.SaMode; -import cn.dev33.satoken.apikey.SaApiKeyUtil; +import cn.dev33.satoken.apikey.annotation.SaCheckApiKey; import cn.dev33.satoken.apikey.model.ApiKeyModel; +import cn.dev33.satoken.apikey.template.SaApiKeyUtil; import cn.dev33.satoken.util.SaResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/sa-token-doc/plugin/api-key.md b/sa-token-doc/plugin/api-key.md index 6047acff..c18fa8c7 100644 --- a/sa-token-doc/plugin/api-key.md +++ b/sa-token-doc/plugin/api-key.md @@ -68,12 +68,21 @@ API Key 具有以下特点: +### 2、引入依赖 +在使用 API Key 模块之前,你必须先引入依赖: +``` xml + + + cn.dev33 + sa-token-apikey + ${sa.top.version} + +``` -### 2、创建 API Key +### 3、创建 API Key -理解了应用场景后,让我们看看 Sa-Token 为 API Key 提供了哪些方法 -*(此插件是内嵌到 sa-token-core 核心包中的模块,大家无需再次引入其它依赖,插件直接可用)*: +理解了应用场景后,让我们看看 Sa-Token 为 API Key 提供了哪些方法: ``` java @@ -117,7 +126,7 @@ List apiKeyList = SaApiKeyUtil.getApiKeyList(10001); ``` -### 3、校验 API Key +### 4、校验 API Key ``` java // 校验指定 API Key 是否有效,无效会抛出异常 ApiKeyException @@ -181,7 +190,7 @@ public class ApiKeyResourcesController { ``` -### 4、前端如何提交 API Key? +### 5、前端如何提交 API Key? 默认情况下,前端可以从任意途径提交 API Key 字符串,只要后端能接受到。 但是如果后端是通过 `SaApiKeyUtil.currentApiKey()` 方法获取,或者 `@SaCheckApiKey` 注解校验,则需要前端按照一定的格式来提交了: @@ -203,7 +212,7 @@ http://AK-NAO6u57zbOWCmLaiVQuVW2tyt3rHpZrXkaQp@localhost:8081/user/getInfo -### 5、打开数据库模式 +### 6、打开数据库模式 框架默认将所有 API Key 信息保存在缓存中,这可以称之为“缓存模式”,这种模式下,重启缓存库后,数据将丢失。 @@ -244,7 +253,7 @@ public class SaApiKeyDataLoaderImpl implements SaApiKeyDataLoader { -### 6、多账号模式使用 +### 7、多账号模式使用 如果系统有多套账号表,比如 Admin 和 User,只需要指定不同的命名空间即可: diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md index 148f5a37..06d605a6 100644 --- a/sa-token-doc/start/download.md +++ b/sa-token-doc/start/download.md @@ -200,6 +200,7 @@ Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/d ├── 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-redisson // [插件] Sa-Token 整合 Redisson (数据缓存插件) ├── sa-token-redisx // [插件] Sa-Token 整合 Redisx (数据缓存插件) ├── sa-token-serializer-features // [插件] Sa-Token 序列化实现扩展 diff --git a/sa-token-plugin/pom.xml b/sa-token-plugin/pom.xml index a6ce6ac2..7b5322bd 100644 --- a/sa-token-plugin/pom.xml +++ b/sa-token-plugin/pom.xml @@ -33,6 +33,7 @@ sa-token-jwt sa-token-sso sa-token-oauth2 + sa-token-apikey sa-token-redisson sa-token-redisx sa-token-serializer-features diff --git a/sa-token-plugin/sa-token-apikey/pom.xml b/sa-token-plugin/sa-token-apikey/pom.xml new file mode 100644 index 00000000..f79b5d53 --- /dev/null +++ b/sa-token-plugin/sa-token-apikey/pom.xml @@ -0,0 +1,21 @@ + + + + sa-token-plugin + cn.dev33 + ${revision} + ../pom.xml + + 4.0.0 + + sa-token-apikey + + + + cn.dev33 + sa-token-core + + + \ No newline at end of file diff --git a/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/SaApiKeyManager.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/SaApiKeyManager.java new file mode 100644 index 00000000..b7de8bea --- /dev/null +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/SaApiKeyManager.java @@ -0,0 +1,89 @@ +/* + * 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 cn.dev33.satoken.apikey; + +import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoader; +import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoaderDefaultImpl; +import cn.dev33.satoken.apikey.config.SaApiKeyConfig; +import cn.dev33.satoken.apikey.template.SaApiKeyTemplate; +import cn.dev33.satoken.listener.SaTokenEventCenter; + +/** + * 管理 Sa-Token API Key 所有全局组件 + * + * @author click33 + * @since 1.43.0 + */ +public class SaApiKeyManager { + + /** + * API Key 配置 Bean + */ + private static volatile SaApiKeyConfig config; + public static SaApiKeyConfig getConfig() { + if (config == null) { + // 初始化默认值 + synchronized (SaApiKeyManager.class) { + if (config == null) { + setConfig(new SaApiKeyConfig()); + } + } + } + return config; + } + public static void setConfig(SaApiKeyConfig config) { + SaApiKeyManager.config = config; + } + + /** + * ApiKey 数据加载器 + */ + private volatile static SaApiKeyDataLoader apiKeyDataLoader; + public static void setSaApiKeyDataLoader(SaApiKeyDataLoader apiKeyDataLoader) { + SaApiKeyManager.apiKeyDataLoader = apiKeyDataLoader; + SaTokenEventCenter.doRegisterComponent("SaApiKeyDataLoader", apiKeyDataLoader); + } + public static SaApiKeyDataLoader getSaApiKeyDataLoader() { + if (apiKeyDataLoader == null) { + synchronized (SaApiKeyManager.class) { + if (apiKeyDataLoader == null) { + SaApiKeyManager.apiKeyDataLoader = new SaApiKeyDataLoaderDefaultImpl(); + } + } + } + return apiKeyDataLoader; + } + + /** + * ApiKey 操作类 + */ + private volatile static SaApiKeyTemplate apiKeyTemplate; + public static void setSaApiKeyTemplate(SaApiKeyTemplate apiKeyTemplate) { + SaApiKeyManager.apiKeyTemplate = apiKeyTemplate; + SaTokenEventCenter.doRegisterComponent("SaApiKeyTemplate", apiKeyTemplate); + } + public static SaApiKeyTemplate getSaApiKeyTemplate() { + if (apiKeyTemplate == null) { + synchronized (SaApiKeyManager.class) { + if (apiKeyTemplate == null) { + SaApiKeyManager.apiKeyTemplate = new SaApiKeyTemplate(); + } + } + } + return apiKeyTemplate; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckApiKey.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/SaCheckApiKey.java similarity index 93% rename from sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckApiKey.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/SaCheckApiKey.java index 96ea3d3f..acdc3317 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckApiKey.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/SaCheckApiKey.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.annotation; +package cn.dev33.satoken.apikey.annotation; + +import cn.dev33.satoken.annotation.SaMode; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckApiKeyHandler.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/handle/SaCheckApiKeyHandler.java similarity index 86% rename from sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckApiKeyHandler.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/handle/SaCheckApiKeyHandler.java index c8d6e2a3..5a2e897e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckApiKeyHandler.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/annotation/handle/SaCheckApiKeyHandler.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.annotation.handler; +package cn.dev33.satoken.apikey.annotation.handle; -import cn.dev33.satoken.annotation.SaCheckApiKey; import cn.dev33.satoken.annotation.SaMode; -import cn.dev33.satoken.apikey.SaApiKeyUtil; +import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface; +import cn.dev33.satoken.apikey.annotation.SaCheckApiKey; +import cn.dev33.satoken.apikey.template.SaApiKeyUtil; import cn.dev33.satoken.context.SaHolder; import java.lang.reflect.AnnotatedElement; diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaApiKeyConfig.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/config/SaApiKeyConfig.java similarity index 98% rename from sa-token-core/src/main/java/cn/dev33/satoken/config/SaApiKeyConfig.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/config/SaApiKeyConfig.java index 452a05e5..d8c5a9fd 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaApiKeyConfig.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/config/SaApiKeyConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.config; +package cn.dev33.satoken.apikey.config; /** * Sa-Token API Key 相关配置 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java similarity index 92% rename from sa-token-core/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java index 5d81936d..7d14cb4a 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoader.java @@ -15,7 +15,7 @@ */ package cn.dev33.satoken.apikey.loader; -import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.apikey.SaApiKeyManager; import cn.dev33.satoken.apikey.model.ApiKeyModel; /** @@ -32,7 +32,7 @@ public interface SaApiKeyDataLoader { * @return / */ default Boolean getIsRecordIndex() { - return SaManager.getConfig().getApiKey().getIsRecordIndex(); + return SaApiKeyManager.getConfig().getIsRecordIndex(); } /** diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoaderDefaultImpl.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoaderDefaultImpl.java similarity index 100% rename from sa-token-core/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoaderDefaultImpl.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/loader/SaApiKeyDataLoaderDefaultImpl.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/model/ApiKeyModel.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/model/ApiKeyModel.java similarity index 100% rename from sa-token-core/src/main/java/cn/dev33/satoken/apikey/model/ApiKeyModel.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/model/ApiKeyModel.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyTemplate.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyTemplate.java similarity index 97% rename from sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyTemplate.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyTemplate.java index 7e721c56..903a0a92 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyTemplate.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyTemplate.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.apikey; +package cn.dev33.satoken.apikey.template; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.apikey.SaApiKeyManager; import cn.dev33.satoken.apikey.model.ApiKeyModel; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaHolder; @@ -94,7 +95,7 @@ public class SaApiKeyTemplate { * @return / */ public ApiKeyModel getApiKeyModelFromDatabase(String apiKey) { - return SaManager.getSaApiKeyDataLoader().getApiKeyModelFromDatabase(namespace, apiKey); + return SaApiKeyManager.getSaApiKeyDataLoader().getApiKeyModelFromDatabase(namespace, apiKey); } /** @@ -264,7 +265,7 @@ public class SaApiKeyTemplate { * @return / */ public ApiKeyModel createApiKeyModel(Object loginId) { - long timeout = SaManager.getConfig().getApiKey().getTimeout(); + long timeout = SaApiKeyManager.getConfig().getTimeout(); long expiresTime = (timeout == SaTokenDao.NEVER_EXPIRE) ? SaTokenDao.NEVER_EXPIRE : System.currentTimeMillis() + timeout * 1000; return createApiKeyModel() .setLoginId(loginId) @@ -279,7 +280,7 @@ public class SaApiKeyTemplate { * @return / */ public String randomApiKeyValue() { - return SaManager.getConfig().getApiKey().getPrefix() + SaFoxUtil.getRandomString(36); + return SaApiKeyManager.getConfig().getPrefix() + SaFoxUtil.getRandomString(36); } @@ -553,7 +554,7 @@ public class SaApiKeyTemplate { * 是否保存索引信息 */ public boolean getIsRecordIndex() { - return SaManager.getSaApiKeyDataLoader().getIsRecordIndex(); + return SaApiKeyManager.getSaApiKeyDataLoader().getIsRecordIndex(); } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyUtil.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyUtil.java similarity index 76% rename from sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyUtil.java rename to sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyUtil.java index 40873fad..47e62805 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/apikey/SaApiKeyUtil.java +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/apikey/template/SaApiKeyUtil.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.apikey; +package cn.dev33.satoken.apikey.template; -import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.apikey.SaApiKeyManager; import cn.dev33.satoken.apikey.model.ApiKeyModel; import cn.dev33.satoken.context.model.SaRequest; import cn.dev33.satoken.session.SaSession; @@ -36,7 +36,7 @@ public class SaApiKeyUtil { * @return / */ public static ApiKeyModel getApiKey(String apiKey) { - return SaManager.getSaApiKeyTemplate().getApiKey(apiKey); + return SaApiKeyManager.getSaApiKeyTemplate().getApiKey(apiKey); } /** @@ -45,7 +45,7 @@ public class SaApiKeyUtil { * @return / */ public static ApiKeyModel checkApiKey(String apiKey) { - return SaManager.getSaApiKeyTemplate().checkApiKey(apiKey); + return SaApiKeyManager.getSaApiKeyTemplate().checkApiKey(apiKey); } /** @@ -53,7 +53,7 @@ public class SaApiKeyUtil { * @param ak / */ public static void saveApiKey(ApiKeyModel ak) { - SaManager.getSaApiKeyTemplate().saveApiKey(ak); + SaApiKeyManager.getSaApiKeyTemplate().saveApiKey(ak); } /** @@ -62,7 +62,7 @@ public class SaApiKeyUtil { * @return LoginId */ public static Object getLoginIdByApiKey(String apiKey) { - return SaManager.getSaApiKeyTemplate().getLoginIdByApiKey(apiKey); + return SaApiKeyManager.getSaApiKeyTemplate().getLoginIdByApiKey(apiKey); } /** @@ -70,7 +70,7 @@ public class SaApiKeyUtil { * @param apiKey ApiKey */ public static void deleteApiKey(String apiKey) { - SaManager.getSaApiKeyTemplate().deleteApiKey(apiKey); + SaApiKeyManager.getSaApiKeyTemplate().deleteApiKey(apiKey); } /** @@ -78,7 +78,7 @@ public class SaApiKeyUtil { * @param loginId / */ public static void deleteApiKeyByLoginId(Object loginId) { - SaManager.getSaApiKeyTemplate().deleteApiKeyByLoginId(loginId); + SaApiKeyManager.getSaApiKeyTemplate().deleteApiKeyByLoginId(loginId); } // ------- 创建 @@ -89,7 +89,7 @@ public class SaApiKeyUtil { * @return / */ public static ApiKeyModel createApiKeyModel() { - return SaManager.getSaApiKeyTemplate().createApiKeyModel(); + return SaApiKeyManager.getSaApiKeyTemplate().createApiKeyModel(); } /** @@ -98,7 +98,7 @@ public class SaApiKeyUtil { * @return / */ public static ApiKeyModel createApiKeyModel(Object loginId) { - return SaManager.getSaApiKeyTemplate().createApiKeyModel(loginId); + return SaApiKeyManager.getSaApiKeyTemplate().createApiKeyModel(loginId); } @@ -110,7 +110,7 @@ public class SaApiKeyUtil { * @param scopes 需要校验的权限列表 */ public static boolean hasApiKeyScope(String apiKey, String... scopes) { - return SaManager.getSaApiKeyTemplate().hasApiKeyScope(apiKey, scopes); + return SaApiKeyManager.getSaApiKeyTemplate().hasApiKeyScope(apiKey, scopes); } /** @@ -119,7 +119,7 @@ public class SaApiKeyUtil { * @param scopes 需要校验的权限列表 */ public static void checkApiKeyScope(String apiKey, String... scopes) { - SaManager.getSaApiKeyTemplate().checkApiKeyScope(apiKey, scopes); + SaApiKeyManager.getSaApiKeyTemplate().checkApiKeyScope(apiKey, scopes); } /** @@ -128,7 +128,7 @@ public class SaApiKeyUtil { * @param scopes 需要校验的权限列表 */ public static boolean hasApiKeyScopeOr(String apiKey, String... scopes) { - return SaManager.getSaApiKeyTemplate().hasApiKeyScopeOr(apiKey, scopes); + return SaApiKeyManager.getSaApiKeyTemplate().hasApiKeyScopeOr(apiKey, scopes); } /** @@ -137,7 +137,7 @@ public class SaApiKeyUtil { * @param scopes 需要校验的权限列表 */ public static void checkApiKeyScopeOr(String apiKey, String... scopes) { - SaManager.getSaApiKeyTemplate().checkApiKeyScopeOr(apiKey, scopes); + SaApiKeyManager.getSaApiKeyTemplate().checkApiKeyScopeOr(apiKey, scopes); } /** @@ -146,7 +146,7 @@ public class SaApiKeyUtil { * @param loginId / */ public static boolean isApiKeyLoginId(String apiKey, Object loginId) { - return SaManager.getSaApiKeyTemplate().isApiKeyLoginId(apiKey, loginId); + return SaApiKeyManager.getSaApiKeyTemplate().isApiKeyLoginId(apiKey, loginId); } /** @@ -156,7 +156,7 @@ public class SaApiKeyUtil { * @param loginId / */ public static void checkApiKeyLoginId(String apiKey, Object loginId) { - SaManager.getSaApiKeyTemplate().checkApiKeyLoginId(apiKey, loginId); + SaApiKeyManager.getSaApiKeyTemplate().checkApiKeyLoginId(apiKey, loginId); } @@ -166,14 +166,14 @@ public class SaApiKeyUtil { * 数据读取:从请求对象中读取 ApiKey,获取不到返回 null */ public static String readApiKeyValue(SaRequest request) { - return SaManager.getSaApiKeyTemplate().readApiKeyValue(request); + return SaApiKeyManager.getSaApiKeyTemplate().readApiKeyValue(request); } /** * 数据读取:从请求对象中读取 ApiKey,并查询到 ApiKeyModel 信息 */ public static ApiKeyModel currentApiKey() { - return SaManager.getSaApiKeyTemplate().currentApiKey(); + return SaApiKeyManager.getSaApiKeyTemplate().currentApiKey(); } @@ -185,7 +185,7 @@ public class SaApiKeyUtil { * @param session 可填写 null,代表使用 loginId 现场查询 */ public static void adjustIndex(Object loginId, SaSession session) { - SaManager.getSaApiKeyTemplate().adjustIndex(loginId, session); + SaApiKeyManager.getSaApiKeyTemplate().adjustIndex(loginId, session); } /** @@ -194,7 +194,7 @@ public class SaApiKeyUtil { * @return / */ public static List getApiKeyList(Object loginId) { - return SaManager.getSaApiKeyTemplate().getApiKeyList(loginId); + return SaApiKeyManager.getSaApiKeyTemplate().getApiKeyList(loginId); } } diff --git a/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForApiKey.java b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForApiKey.java new file mode 100644 index 00000000..81a51a17 --- /dev/null +++ b/sa-token-plugin/sa-token-apikey/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForApiKey.java @@ -0,0 +1,35 @@ +/* + * 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 cn.dev33.satoken.plugin; + +import cn.dev33.satoken.apikey.annotation.handle.SaCheckApiKeyHandler; +import cn.dev33.satoken.strategy.SaAnnotationStrategy; + +/** + * SaToken 插件安装:API Key 组件 + * + * @author click33 + * @since 1.43.0 + */ +public class SaTokenPluginForApiKey implements SaTokenPlugin { + + @Override + public void install() { + // 安装 API Key 鉴权注解 + SaAnnotationStrategy.instance.registerAnnotationHandler(new SaCheckApiKeyHandler()); + } + +} \ No newline at end of file diff --git a/sa-token-plugin/sa-token-apikey/src/main/resources/META-INF/satoken/cn.dev33.satoken.plugin.SaTokenPlugin b/sa-token-plugin/sa-token-apikey/src/main/resources/META-INF/satoken/cn.dev33.satoken.plugin.SaTokenPlugin new file mode 100644 index 00000000..027e9459 --- /dev/null +++ b/sa-token-plugin/sa-token-apikey/src/main/resources/META-INF/satoken/cn.dev33.satoken.plugin.SaTokenPlugin @@ -0,0 +1 @@ +cn.dev33.satoken.plugin.SaTokenPluginForApiKey \ No newline at end of file diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/pom.xml b/sa-token-starter/sa-token-spring-boot-autoconfig/pom.xml index 67ab67be..87af2ee7 100644 --- a/sa-token-starter/sa-token-spring-boot-autoconfig/pom.xml +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/pom.xml @@ -49,19 +49,27 @@ sa-token-jackson - - - cn.dev33 - sa-token-oauth2 - true - - cn.dev33 sa-token-sso true + + + + cn.dev33 + sa-token-oauth2 + true + + + + + cn.dev33 + sa-token-apikey + true + + diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java index 3a2d2fb4..a7b743a5 100644 --- a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java @@ -17,8 +17,6 @@ package cn.dev33.satoken.spring; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface; -import cn.dev33.satoken.apikey.SaApiKeyTemplate; -import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoader; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; import cn.dev33.satoken.dao.SaTokenDao; @@ -219,26 +217,6 @@ public class SaBeanInject { SaManager.setSaSignTemplate(saSignTemplate); } - /** - * 注入自定义的 ApiKey 模块 Bean - * - * @param apiKeyTemplate / - */ - @Autowired(required = false) - public void setSaApiKeyTemplate(SaApiKeyTemplate apiKeyTemplate) { - SaManager.setSaApiKeyTemplate(apiKeyTemplate); - } - - /** - * 注入自定义的 ApiKey 数据加载器 Bean - * - * @param apiKeyDataLoader / - */ - @Autowired(required = false) - public void setSaApiKeyDataLoader(SaApiKeyDataLoader apiKeyDataLoader) { - SaManager.setSaApiKeyDataLoader(apiKeyDataLoader); - } - /** * 注入自定义的 TOTP 算法 Bean * diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanInject.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanInject.java new file mode 100644 index 00000000..3579f8d7 --- /dev/null +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanInject.java @@ -0,0 +1,64 @@ +/* + * 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 cn.dev33.satoken.spring.apikey; + +import cn.dev33.satoken.apikey.SaApiKeyManager; +import cn.dev33.satoken.apikey.config.SaApiKeyConfig; +import cn.dev33.satoken.apikey.loader.SaApiKeyDataLoader; +import cn.dev33.satoken.apikey.template.SaApiKeyTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; + +/** + * 注入 Sa-Token API Key 所需要的 Bean + * + * @author click33 + * @since 1.43.0 + */ +@ConditionalOnClass(SaApiKeyManager.class) +public class SaApiKeyBeanInject { + + /** + * 注入 API Key 配置对象 + * + * @param saApiKeyConfig 配置对象 + */ + @Autowired(required = false) + public void setSaOAuth2Config(SaApiKeyConfig saApiKeyConfig) { + SaApiKeyManager.setConfig(saApiKeyConfig); + } + + /** + * 注入自定义的 API Key 模版方法 Bean + * + * @param apiKeyTemplate / + */ + @Autowired(required = false) + public void setSaApiKeyTemplate(SaApiKeyTemplate apiKeyTemplate) { + SaApiKeyManager.setSaApiKeyTemplate(apiKeyTemplate); + } + + /** + * 注入自定义的 API Key 数据加载器 Bean + * + * @param apiKeyDataLoader / + */ + @Autowired(required = false) + public void setSaApiKeyDataLoader(SaApiKeyDataLoader apiKeyDataLoader) { + SaApiKeyManager.setSaApiKeyDataLoader(apiKeyDataLoader); + } + +} diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanRegister.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanRegister.java new file mode 100644 index 00000000..2212c323 --- /dev/null +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/SaApiKeyBeanRegister.java @@ -0,0 +1,43 @@ +/* + * 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 cn.dev33.satoken.spring.apikey; + +import cn.dev33.satoken.apikey.SaApiKeyManager; +import cn.dev33.satoken.apikey.config.SaApiKeyConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * 注册 Sa-Token API Key 所需要的 Bean + * + * @author click33 + * @since 1.34.0 + */ +@ConditionalOnClass(SaApiKeyManager.class) +public class SaApiKeyBeanRegister { + + /** + * 获取 API Key 配置对象 + * @return 配置对象 + */ + @Bean + @ConfigurationProperties(prefix = "sa-token.api-key") + public SaApiKeyConfig getSaApiKeyConfig() { + return new SaApiKeyConfig(); + } + +} diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/package-info.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/package-info.java new file mode 100644 index 00000000..f5874af8 --- /dev/null +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/apikey/package-info.java @@ -0,0 +1,19 @@ +/* + * 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. + */ +/** + * sa-token-apikey 模块自动化配置(只有引入了 sa-token-apikey 模块后,此包下的代码才会开始工作) + */ +package cn.dev33.satoken.spring.apikey; \ No newline at end of file