From 167cff595e716c4f67c5e3a8ae2d80b3db786cda Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Mon, 7 Sep 2020 02:21:35 +0800 Subject: [PATCH] =?UTF-8?q?v1.4.0=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 +- sa-token-demo-springboot/.gitignore | 4 +- sa-token-demo-springboot/pom.xml | 48 +--- .../java/com/pj/SaTokenDemoApplication.java | 8 +- .../java/com/pj/satoken/MySaTokenConfig.java | 28 +- .../main/java/com/pj/test/TestController.java | 30 +- .../src/main/resources/application.yml | 35 +-- sa-token-dev/.gitignore | 6 +- sa-token-dev/pom.xml | 9 +- .../java/cn/dev33/satoken/SaTokenManager.java | 19 +- .../java/cn/dev33/satoken/SaTokenUtil.java | 30 -- .../annotation/SaCheckInterceptor.java | 21 +- .../satoken/annotation/SaCheckLogin.java | 2 + .../satoken/annotation/SaCheckPermission.java | 4 +- .../dev33/satoken/config/SaTokenConfig.java | 39 ++- .../satoken/config/SaTokenConfigFactory.java | 11 +- .../java/cn/dev33/satoken/dao/SaTokenDao.java | 8 +- .../dev33/satoken/dao/SaTokenDaoDefault.java | 6 +- .../satoken/exception/NotLoginException.java | 17 +- .../exception/NotPermissionException.java | 15 +- .../cn/dev33/satoken/session/SaSession.java | 25 +- .../satoken/session/SaSessionCustomUtil.java | 10 +- .../cn/dev33/satoken/spring/SaTokenSetup.java | 2 + .../dev33/satoken/spring/SpringSaToken.java | 22 +- .../cn/dev33/satoken/stp/StpInterface.java | 9 +- .../satoken/stp/StpInterfaceDefaultImpl.java | 5 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 270 ++++++++++-------- .../java/cn/dev33/satoken/stp/StpUtil.java | 95 +++--- .../cn/dev33/satoken/util/SaCookieUtil.java | 34 +-- .../dev33/satoken/util/SaTokenInsideUtil.java | 40 +++ ...{SpringMVCUtil.java => SpringMvcUtil.java} | 5 +- .../main/java/com/pj/SaTokenApplication.java | 18 -- .../src/main/resources/application.yml | 20 -- sa-token-doc/doc/README.md | 30 +- sa-token-doc/doc/index.html | 2 +- sa-token-doc/doc/logo-150.png | Bin 0 -> 2938 bytes sa-token-doc/doc/more/link.md | 2 +- sa-token-doc/doc/more/update-log.md | 11 +- sa-token-doc/doc/start/download.md | 8 +- sa-token-doc/doc/start/example.md | 2 +- sa-token-doc/doc/use/at-check.md | 4 +- sa-token-doc/doc/use/config.md | 42 +-- sa-token-doc/doc/use/dao-extend.md | 2 +- sa-token-doc/doc/use/jur-auth.md | 2 +- sa-token-doc/doc/use/kick.md | 6 +- sa-token-doc/doc/use/login-auth.md | 14 +- sa-token-doc/doc/use/many-account.md | 8 +- sa-token-doc/doc/use/mock-person.md | 20 +- sa-token-doc/doc/use/not-cookie.md | 24 +- sa-token-doc/doc/use/session.md | 18 +- sa-token-doc/index.html | 4 +- 51 files changed, 624 insertions(+), 500 deletions(-) delete mode 100644 sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenUtil.java create mode 100644 sa-token-dev/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java rename sa-token-dev/src/main/java/cn/dev33/satoken/util/{SpringMVCUtil.java => SpringMvcUtil.java} (97%) delete mode 100644 sa-token-dev/src/main/java/com/pj/SaTokenApplication.java delete mode 100644 sa-token-dev/src/main/resources/application.yml create mode 100644 sa-token-doc/doc/logo-150.png diff --git a/README.md b/README.md index eda6ddc5..3837eae7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,23 @@ -# sa-token +

+ logo +

+

sa-token v1.4.0

+

一个JavaWeb权限认证框架,强大、简单、好用

+

+ + + + + + + +

+ +## sa-token 😋 +- 在线文档:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) +- 需求提交:我们深知一个优秀的项目需要海纳百川,[点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token) -一个JavaWeb权限认证框架,强大、简单、好用 -在线文档:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) - - :kissing_closed_eyes: :kissing_closed_eyes: :kissing_closed_eyes: :yum: :yum: :yum: :innocent: :innocent: :innocent: :heart: :heart: :heart: - - -## 优点 +## 框架优点 与其它权限认证框架相比,sa-token尽力保证两点: - 上手简单:能自动化的配置全部自动化,不让你费脑子 - 功能强大:能涵盖的功能全部涵盖,不让你用个框架还要自己给框架打各种补丁 @@ -24,9 +35,6 @@ - 零配置与Spring等框架集成 - ... -## 需求提交 -- 我们深知一个优秀的项目需要海纳百川,[点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token) - ## 贡献代码 1. 在github上fork一份到自己的仓库 2. clone自己的仓库到本地电脑 diff --git a/sa-token-demo-springboot/.gitignore b/sa-token-demo-springboot/.gitignore index 97a4689d..a578d5b1 100644 --- a/sa-token-demo-springboot/.gitignore +++ b/sa-token-demo-springboot/.gitignore @@ -5,4 +5,6 @@ bin/ .settings/ unpackage/ .classpath -.project \ No newline at end of file +.project + +.idea/ \ No newline at end of file diff --git a/sa-token-demo-springboot/pom.xml b/sa-token-demo-springboot/pom.xml index 9b65c1fc..bb6dc0c2 100644 --- a/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo-springboot/pom.xml @@ -25,11 +25,18 @@ spring-boot-starter-aop + + + cn.dev33 sa-token - 1.0.3 + 1.4.0 @@ -41,44 +48,5 @@ - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - lib/ - com.pj.SaTokenDemoApplication - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy - package - - copy-dependencies - - - - ${project.build.directory}/lib - - - - - - - - \ No newline at end of file diff --git a/sa-token-demo-springboot/src/main/java/com/pj/SaTokenDemoApplication.java b/sa-token-demo-springboot/src/main/java/com/pj/SaTokenDemoApplication.java index 53eb8d1c..1273ceb0 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/SaTokenDemoApplication.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/SaTokenDemoApplication.java @@ -6,18 +6,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import cn.dev33.satoken.SaTokenManager; import cn.dev33.satoken.spring.SaTokenSetup; -@SaTokenSetup // 标注启动 sa-token +@SaTokenSetup // 必须有这个注解,用来标注加载sa-token @SpringBootApplication public class SaTokenDemoApplication { public static void main(String[] args) { - SpringApplication.run(SaTokenDemoApplication.class, args); // run--> + SpringApplication.run(SaTokenDemoApplication.class, args); System.out.println("启动成功:sa-token配置如下:" + SaTokenManager.getConfig()); } - - - - } \ No newline at end of file diff --git a/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java b/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java index 91ab3042..4e8b861d 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/satoken/MySaTokenConfig.java @@ -1,10 +1,13 @@ package com.pj.satoken; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import cn.dev33.satoken.annotation.SaCheckInterceptor; +import cn.dev33.satoken.config.SaTokenConfig; /** * sa-token代码方式进行配置 @@ -13,18 +16,19 @@ import cn.dev33.satoken.annotation.SaCheckInterceptor; public class MySaTokenConfig implements WebMvcConfigurer { // 获取配置Bean (以代码的方式配置sa-token) -// @Primary -// @Bean(name="MySaTokenConfig") -// public SaTokenConfig getSaTokenConfig() { -// SaTokenConfig config = new SaTokenConfig(); -// config.setTokenName("satoken"); // token名称(同时也是cookie名称) -// config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天 -// config.setIsShare(true); // 在多人登录同一账号时,是否共享会话(为true时共用一个,为false时新登录挤掉旧登录) -// config.setIsReadHead(true); // 是否在cookie读取不到token时,继续从请求header里继续尝试读取 -// config.setIsReadBody(true); // 是否在cookie读取不到token时,继续从请求header里继续尝试读取 -// config.setIsV(true); // 是否在初始化配置时打印版本字符画 -// return config; -// } + @Primary + @Bean(name="MySaTokenConfig") + public SaTokenConfig getSaTokenConfig() { + SaTokenConfig config = new SaTokenConfig(); + config.setTokenName("satoken"); // token名称 (同时也是cookie名称) + config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天 + config.setIsShare(true); // 在多人登录同一账号时,是否共享会话 (为true时共用一个,为false时新登录挤掉旧登录) + config.setIsReadBody(true); // 是否尝试从请求体里读取token + config.setIsReadHead(true); // 是否尝试从header里读取token + config.setIsReadCookie(true); // 是否尝试从cookie里读取token + config.setIsV(true); // 是否在初始化配置时打印版本字符画 + return config; + } // 注册sa-token的拦截器,打开注解式鉴权功能 @Override diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index 6f295eb2..f5fc23dd 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -9,6 +9,11 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.session.SaSessionCustomUtil; import cn.dev33.satoken.stp.StpUtil; +/** + * 测试专用Controller + * @author kong + * + */ @RestController @RequestMapping("/test/") public class TestController { @@ -19,22 +24,22 @@ public class TestController { System.out.println("======================= 进入方法,测试登录接口 ========================= "); System.out.println("当前会话的token:" + StpUtil.getTokenValue()); System.out.println("当前是否登录:" + StpUtil.isLogin()); - System.out.println("当前登录账号:" + StpUtil.getLoginId_defaultNull()); + System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull()); StpUtil.setLoginId(id); // 在当前会话登录此账号 System.out.println("登录成功"); System.out.println("当前是否登录:" + StpUtil.isLogin()); System.out.println("当前登录账号:" + StpUtil.getLoginId()); - System.out.println("当前登录账号:" + StpUtil.getLoginId_asInt()); // 获取登录id并转为int + System.out.println("当前登录账号:" + StpUtil.getLoginIdAsInt()); // 获取登录id并转为int // StpUtil.logout(); // System.out.println("注销登录"); // System.out.println("当前是否登录:" + StpUtil.isLogin()); -// System.out.println("当前登录账号:" + StpUtil.getLoginId_defaultNull()); +// System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull()); // StpUtil.setLoginId(id); // 在当前会话登录此账号 // System.out.println("根据token找登录id:" + StpUtil.getLoginIdByToken(StpUtil.getTokenValue())); System.out.println("当前token信息:" + StpUtil.getTokenInfo()); // 获取登录id并转为int - System.out.println("当前登录账号:" + StpUtil.getLoginId_defaultNull()); + System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull()); return AjaxJson.getSuccess(); } @@ -87,20 +92,27 @@ public class TestController { System.out.println("测试取值name:" + SaSessionCustomUtil.getSessionById("1895544896").getAttribute("name")); return AjaxJson.getSuccess(); } + + // 打印当前token信息, 浏览器访问: http://localhost:8081/test/tokenInfo + @RequestMapping("tokenInfo") + public AjaxJson tokenInfo() { + System.out.println("======================= 进入方法,打印当前token信息 ========================= "); + System.out.println(StpUtil.getTokenInfo()); + return AjaxJson.getSuccess(); + } - // 测试注解式鉴权, 浏览器访问: http://localhost:8081/test/at_check + // 测试注解式鉴权, 浏览器访问: http://localhost:8081/test/atCheck @SaCheckLogin // 注解式鉴权:当前会话必须登录才能通过 @SaCheckPermission("user-add") // 注解式鉴权:当前会话必须具有指定权限才能通过 - @RequestMapping("at_check") - public AjaxJson at_check() { + @RequestMapping("atCheck") + public AjaxJson atCheck() { System.out.println("======================= 进入方法,测试注解鉴权接口 ========================= "); System.out.println("只有通过注解鉴权,才能进入此方法"); return AjaxJson.getSuccess(); } - - @SaCheckLogin // 注解式鉴权:当前会话必须登录才能通过 + @SaCheckLogin // 注解式鉴权:当前会话必须登录才能通过 @RequestMapping("getInfo") public AjaxJson getInfo() { return AjaxJson.getSuccessData("用户信息"); diff --git a/sa-token-demo-springboot/src/main/resources/application.yml b/sa-token-demo-springboot/src/main/resources/application.yml index 792fab7f..393fd2e0 100644 --- a/sa-token-demo-springboot/src/main/resources/application.yml +++ b/sa-token-demo-springboot/src/main/resources/application.yml @@ -5,16 +5,18 @@ server: spring: # sa-token配置 sa-token: - # token名称(同时也是cookie名称) + # token名称 (同时也是cookie名称) token-name: satoken - # token有效期,单位s 默认30天,-1为永不过期 + # token有效期,单位s 默认30天 timeout: 2592000 - # 在多人登录同一账号时,是否共享会话(为true时共用一个,为false时新登录挤掉旧登录) + # 在多人登录同一账号时,是否共享会话 (为true时共用一个,为false时新登录挤掉旧登录) is-share: true - # 是否在cookie读取不到token时,继续从请求header里继续尝试读取 - is-read-head: true - # 是否在header读取不到token时,继续从请求题参数里继续尝试读取 + # 是否尝试从请求体里读取token is-read-body: true + # 是否尝试从header里读取token + is-read-head: true + # 是否尝试从cookie里读取token + is-read-cookie: true # 是否在初始化配置时打印版本字符画 is-v: true @@ -29,16 +31,17 @@ spring: port: 6379 # Redis服务器连接密码(默认为空) password: - # 连接池最大连接数(使用负值表示没有限制) - pool: - maxActive: 20 - # 连接池最大阻塞等待时间(使用负值表示没有限制) - maxWait: -1 - # 连接池中的最大空闲连接 - maxIdle: 8 - # 连接池中的最小空闲连接 - minIdle: 1 # 连接超时时间(毫秒) - timeout: 0 + timeout: 1000ms + lettuce: + pool: + # 连接池最大连接数 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 连接池中的最大空闲连接 + max-idle: 10 + # 连接池中的最小空闲连接 + min-idle: 0 \ No newline at end of file diff --git a/sa-token-dev/.gitignore b/sa-token-dev/.gitignore index 97a4689d..f56feec7 100644 --- a/sa-token-dev/.gitignore +++ b/sa-token-dev/.gitignore @@ -5,4 +5,8 @@ bin/ .settings/ unpackage/ .classpath -.project \ No newline at end of file +.project + +.factorypath + +.idea/ \ No newline at end of file diff --git a/sa-token-dev/pom.xml b/sa-token-dev/pom.xml index a152258e..4d01fc36 100644 --- a/sa-token-dev/pom.xml +++ b/sa-token-dev/pom.xml @@ -7,7 +7,7 @@ cn.dev33 sa-token-dev jar - 1.0.3 + 1.4.0 @@ -27,6 +27,13 @@ org.springframework.boot spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenManager.java b/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenManager.java index 0f25e17b..f6b30af3 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenManager.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenManager.java @@ -6,15 +6,19 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDaoDefault; import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpInterfaceDefaultImpl; +import cn.dev33.satoken.util.SaTokenInsideUtil; /** - * 管理sa-token所有对象 + * 管理sa-token所有对象 * @author kong * */ public class SaTokenManager { - // 配置文件 Bean + + /** + * 配置文件 Bean + */ private static SaTokenConfig config; public static SaTokenConfig getConfig() { if (config == null) { @@ -25,7 +29,7 @@ public class SaTokenManager { public static void setConfig(SaTokenConfig config) { SaTokenManager.config = config; if(config.getIsV()) { - SaTokenUtil.printSaToken(); + SaTokenInsideUtil.printSaToken(); } } public synchronized static void initConfig() { @@ -34,7 +38,10 @@ public class SaTokenManager { } } - // 持久化 Bean + + /** + * 持久化 Bean + */ public static SaTokenDao dao; public static SaTokenDao getDao() { if (dao == null) { @@ -52,7 +59,9 @@ public class SaTokenManager { } - // 权限认证 Bean + /** + * 权限认证 Bean + */ public static StpInterface stp; public static StpInterface getStp() { if (stp == null) { diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenUtil.java deleted file mode 100644 index 7d8c4d04..00000000 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/SaTokenUtil.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.dev33.satoken; - -/** - * sa-token 工具类 - */ -public class SaTokenUtil { - - - // sa-token 版本号 - public static final String version = "v1.0.3"; - - // sa-token 开源地址 - public static final String github_url = "https://github.com/click33/sa-token"; - - // 打印 sa-token - public static void printSaToken() { - String str = - "____ ____ ___ ____ _ _ ____ _ _ \r\n" + - "[__ |__| __ | | | |_/ |___ |\\ | \r\n" + - "___] | | | |__| | \\_ |___ | \\| \r\n" + - "sa-token:" + version + " \r\n" + - "GitHub:" + github_url + "\r\n"; - System.out.println(str); - } - - // 如果token为本次请求新创建的,则以此字符串为key存储在当前request中 JUST_CREATED_SAVE_KEY - public static final String JUST_CREATED_SAVE_KEY= "JUST_CREATED_SAVE_KEY_"; - - -} diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckInterceptor.java b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckInterceptor.java index a360132a..eeb821ef 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckInterceptor.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckInterceptor.java @@ -11,11 +11,14 @@ import cn.dev33.satoken.stp.StpUtil; /** * 注解式鉴权 - 拦截器 + * @author kong */ public class SaCheckInterceptor implements HandlerInterceptor { - // 底层的 StpLogic 对象 + /** + * 底层的 StpLogic 对象 + */ public StpLogic stpLogic = null; /** @@ -36,7 +39,9 @@ public class SaCheckInterceptor implements HandlerInterceptor { - // 每次请求之前触发 + /** + * 每次请求之前触发 + */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { @@ -62,7 +67,7 @@ public class SaCheckInterceptor implements HandlerInterceptor { } // 开始验证权限 - Object[] codeArray = concatABC(scp.value(), scp.valueInt(), scp.valueLong()); + Object[] codeArray = concatAbc(scp.value(), scp.valueInt(), scp.valueLong()); if(scp.isAnd()) { stpLogic.checkPermissionAnd(codeArray); // 必须全部都有 } else { @@ -76,8 +81,14 @@ public class SaCheckInterceptor implements HandlerInterceptor { - // 合并三个数组 - private Object[] concatABC(String[] a, int[] b, long[] c) { + /** + * 合并三个数组 + * @param a . + * @param b . + * @param c . + * @return . + */ + private Object[] concatAbc(String[] a, int[] b, long[] c) { // 循环赋值 Object[] d = new Object[a.length + b.length + c.length]; for (int i = 0; i < a.length; i++) { diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java index 48da60ef..3476159a 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java @@ -7,6 +7,8 @@ import java.lang.annotation.Target; /** * 标注一个路由方法,当前会话必须已登录才能通过 + * @author kong + * */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE }) diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java index b5ec8b68..f783c609 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java @@ -6,7 +6,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 标注一个路由方法,当前会话必须具有指定权限才可以通过 + * 标注一个路由方法,当前会话必须具有指定权限才可以通过 + * @author kong + * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 2d2dd7e2..36738438 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -2,14 +2,17 @@ package cn.dev33.satoken.config; /** * sa-token 总配置类 + * @author kong + * */ public class SaTokenConfig { - private String tokenName = "satoken"; // token名称(同时也是cookie名称) - private long timeout = 30 * 24 * 60 * 60; // token有效期,单位s 默认30天 - private Boolean isShare = true; // 在多人登录同一账号时,是否共享会话(为true时共用一个,为false时新登录挤掉旧登录) - private Boolean isReadHead = true; // 是否在cookie读取不到token时,继续从请求header里继续尝试读取 - private Boolean isReadBody = true; // 是否在header读取不到token时,继续从请求题参数里继续尝试读取 + private String tokenName = "satoken"; // token名称 (同时也是cookie名称) + private long timeout = 30 * 24 * 60 * 60; // token有效期,单位s 默认30天 + private Boolean isShare = true; // 在多人登录同一账号时,是否共享会话 (为true时共用一个,为false时新登录挤掉旧登录) + private Boolean isReadBody = true; // 是否尝试从请求体里读取token + private Boolean isReadHead = true; // 是否尝试从header里读取token + private Boolean isReadCookie = true; // 是否尝试从cookie里读取token private Boolean isV = true; // 是否在初始化配置时打印版本字符画 @@ -58,6 +61,20 @@ public class SaTokenConfig { this.isShare = isShare; } + /** + * @return isReadCookie + */ + public Boolean getIsReadCookie() { + return isReadCookie; + } + + /** + * @param isReadCookie 要设置的 isReadCookie + */ + public void setIsReadCookie(Boolean isReadCookie) { + this.isReadCookie = isReadCookie; + } + /** * @return isReadHead */ @@ -100,14 +117,18 @@ public class SaTokenConfig { this.isV = isV; } - /* (非 Javadoc) - * @see java.lang.Object#toString() - */ + + + @Override public String toString() { return "SaTokenConfig [tokenName=" + tokenName + ", timeout=" + timeout + ", isShare=" + isShare - + ", isReadHead=" + isReadHead + ", isReadBody=" + isReadBody + ", isV=" + isV + "]"; + + ", isReadBody=" + isReadBody + ", isReadHead=" + isReadHead + ", isReadCookie=" + isReadCookie + + ", isV=" + isV + "]"; } + + + diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java b/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java index 034a6d73..63e69c0e 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java @@ -8,12 +8,17 @@ import java.util.Map; import java.util.Properties; /** - 创建一个配置文件 + * 创建一个配置文件 + * @author kong + * */ public class SaTokenConfigFactory { - public static String configPath = "sa-token.properties"; // 默认配置文件地址 + /** + * 默认配置文件地址 + */ + public static String configPath = "sa-token.properties"; /** * 根据指定路径获取配置信息 @@ -97,7 +102,7 @@ public class SaTokenConfigFactory { * 将字符串转化为指定数据类型 * @param str 值 * @param cs 要转换的类型 - * @return + * @return . */ @SuppressWarnings("unchecked") private static T getObjectByClass(String str, Class cs){ diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java b/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java index e676a2a1..aa6408cb 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.session.SaSession; /** * sa-token持久层的接口 + * @author kong + * */ public interface SaTokenDao { @@ -11,7 +13,7 @@ public interface SaTokenDao { /** * 根据key获取value ,如果没有,则返回空 * @param key 键名称 - * @return + * @return value */ public String getValue(String key); @@ -25,7 +27,7 @@ public interface SaTokenDao { /** * 删除一个指定的key - * @param key + * @param key 键名称 */ public void delKey(String key); @@ -34,7 +36,7 @@ public interface SaTokenDao { /** * 根据指定key的session,如果没有,则返回空 * @param sessionId 键名称 - * @return + * @return SaSession */ public SaSession getSaSession(String sessionId); diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefault.java b/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefault.java index e61cac1e..72706f8a 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefault.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefault.java @@ -7,10 +7,14 @@ import cn.dev33.satoken.session.SaSession; /** * sa-token持久层默认的实现类 , 基于内存Map + * @author kong + * */ public class SaTokenDaoDefault implements SaTokenDao { - // 所有数据集合 + /** + * 所有数据集合 + */ Map dataMap = new HashMap(); diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotLoginException.java b/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotLoginException.java index 836e9d67..e35cedd2 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotLoginException.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotLoginException.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil; /** * 没有登陆抛出的异常 + * @author kong + * */ public class NotLoginException extends RuntimeException { @@ -16,13 +18,13 @@ public class NotLoginException extends RuntimeException { /** * login_key */ - private String login_key; + private String loginKey; /** * 获得login_key * @return login_key */ public String getLoginKey() { - return login_key; + return loginKey; } @@ -30,16 +32,17 @@ public class NotLoginException extends RuntimeException { * 创建一个 */ public NotLoginException() { - this(StpUtil.stpLogic.login_key); + this(StpUtil.stpLogic.loginKey); } /** * 创建一个 - * @param login_key login_key + * @param loginKey login_key */ - public NotLoginException(String login_key) { - super("当前会话未登录"); // 这里到底要不要拼接上login_key呢?纠结 - this.login_key = login_key; + public NotLoginException(String loginKey) { + // 这里到底要不要拼接上login_key呢?纠结 + super("当前会话未登录"); + this.loginKey = loginKey; } } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java b/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java index 3055775c..a7e1614b 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil; /** * 没有指定权限码,抛出的异常 + * @author kong + * */ public class NotPermissionException extends RuntimeException { @@ -26,23 +28,24 @@ public class NotPermissionException extends RuntimeException { /** * login_key */ - private String login_key; + private String loginKey; /** * 获得login_key * @return login_key */ public String getLoginKey() { - return login_key; + return loginKey; } public NotPermissionException(Object code) { - this(code, StpUtil.stpLogic.login_key); + this(code, StpUtil.stpLogic.loginKey); } - public NotPermissionException(Object code, String login_key) { - super("无此权限:" + code); // 这里到底要不要拼接上login_key呢?纠结 + public NotPermissionException(Object code, String loginKey) { + // 这里到底要不要拼接上login_key呢?纠结 + super("无此权限:" + code); this.code = code; - this.login_key = login_key; + this.loginKey = loginKey; } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSession.java b/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSession.java index d4224bd7..6c3b429c 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSession.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSession.java @@ -17,9 +17,18 @@ public class SaSession implements Serializable { private static final long serialVersionUID = 1L; - private String id; // 会话id - private long createTime; // 当前会话创建时间 - private Map dataMap; // 当前会话键值对 + /** + * 会话id + */ + private String id; + /** + * 当前会话创建时间 + */ + private long createTime; + /** + * 当前会话键值对 + */ + private Map dataMap; /** @@ -34,7 +43,7 @@ public class SaSession implements Serializable { /** * 获取会话id - * @return + * @return id */ public String getId() { return id; @@ -70,15 +79,15 @@ public class SaSession implements Serializable { /** * 取值,并指定取不到值时的默认值 * @param key 名称 - * @param default_value 取不到值的时候返回的默认值 - * @return + * @param defaultValue 取不到值的时候返回的默认值 + * @return value */ - public Object getAttribute(String key, Object default_value) { + public Object getAttribute(String key, Object defaultValue) { Object value = getAttribute(key); if(value != null) { return value; } - return default_value; + return defaultValue; } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java index 5b88c6fc..2055753e 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java @@ -9,7 +9,9 @@ import cn.dev33.satoken.SaTokenManager; */ public class SaSessionCustomUtil { - // 添加上指定前缀,防止恶意伪造session + /** + * 添加上指定前缀,防止恶意伪造session + */ public static String session_key = "custom"; public static String getSessionKey(String sessionId) { return SaTokenManager.getConfig().getTokenName() + ":" + session_key + ":session:" + sessionId; @@ -27,12 +29,12 @@ public class SaSessionCustomUtil { /** * 获取指定key的session * @param sessionId key - * @param is_create 如果没有,是否新建并返回 + * @param isCreate 如果没有,是否新建并返回 * @return */ - public static SaSession getSessionById(String sessionId, boolean is_create) { + public static SaSession getSessionById(String sessionId, boolean isCreate) { SaSession session = SaTokenManager.getDao().getSaSession(getSessionKey(sessionId)); - if(session == null && is_create) { + if(session == null && isCreate) { session = new SaSession(getSessionKey(sessionId)); SaTokenManager.getDao().saveSaSession(session, SaTokenManager.getConfig().getTimeout()); } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SaTokenSetup.java b/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SaTokenSetup.java index 9f839b44..0bb7e1aa 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SaTokenSetup.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SaTokenSetup.java @@ -10,6 +10,8 @@ import org.springframework.context.annotation.Import; /** * 将此注解加到springboot启动类上,即可完成sa-token与springboot的集成 + * @author kong + * */ @Documented @Target({java.lang.annotation.ElementType.TYPE}) diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SpringSaToken.java b/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SpringSaToken.java index def6d041..bf8c07d1 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SpringSaToken.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/spring/SpringSaToken.java @@ -12,33 +12,45 @@ import cn.dev33.satoken.stp.StpInterface; /** * 与SpringBoot集成, 保证此类被扫描,即可完成sa-token与SpringBoot的集成 - * @author kongyongshun + * @author kong * */ @Component public class SpringSaToken { - // 获取配置Bean + /** + * 获取配置Bean + * @return + */ @Bean @ConfigurationProperties(prefix="spring.sa-token") public SaTokenConfig getSaTokenConfig() { return new SaTokenConfig(); } - // 注入配置Bean + /** + * 注入配置Bean + * @param saTokenConfig . + */ @Autowired public void setConfig(SaTokenConfig saTokenConfig){ SaTokenManager.setConfig(saTokenConfig); } - // 注入持久化Bean + /** + * 注入持久化Bean + * @param dao . + */ @Autowired(required = false) public void setDao(SaTokenDao dao){ SaTokenManager.setDao(dao); } - // 注入权限认证Bean + /** + * 注入权限认证Bean + * @param stp . + */ @Autowired(required = false) public void setStp(StpInterface stp){ SaTokenManager.setStp(stp); diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterface.java b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterface.java index 1f4d438f..be24abb4 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterface.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterface.java @@ -3,17 +3,18 @@ package cn.dev33.satoken.stp; import java.util.List; /** - * 开放权限验证接口,方便重写 + * 开放权限验证接口,方便重写 + * @author kong */ public interface StpInterface { /** * 返回指定login_id所拥有的权限码集合 - * @param login_id 账号id - * @param login_key 具体的stp标识 + * @param loginId 账号id + * @param loginKey 具体的stp标识 * @return */ - public List getPermissionCodeList(Object login_id, String login_key); + public List getPermissionCodeList(Object loginId, String loginKey); } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java index aed2fb5d..4a527c6c 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java @@ -4,12 +4,13 @@ import java.util.ArrayList; import java.util.List; /** - * 权限验证接口 ,默认实现 + * 权限验证接口 ,默认实现 + * @author kong */ public class StpInterfaceDefaultImpl implements StpInterface { @Override - public List getPermissionCodeList(Object login_id, String login_key) { + public List getPermissionCodeList(Object loginId, String loginKey) { return new ArrayList(); } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpLogic.java index a2968ad7..9abba608 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -9,30 +9,37 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import cn.dev33.satoken.SaTokenManager; -import cn.dev33.satoken.SaTokenUtil; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.util.SaCookieUtil; -import cn.dev33.satoken.util.SpringMVCUtil; +import cn.dev33.satoken.util.SaTokenInsideUtil; +import cn.dev33.satoken.util.SpringMvcUtil; /** * sa-token 权限验证,逻辑 实现类 *

* (stp = sa-token-permission 的缩写 ) - * + * @author kong */ public class StpLogic { + /** + * 持久化的key前缀,多账号体系时以此值区分,比如:login、user、admin + */ + public String loginKey = ""; - public String login_key = ""; // 持久化的key前缀,多账号体系时以此值区分,比如:login、user、admin - - public StpLogic(String login_key) { - this.login_key = login_key; + /** + * 初始化StpLogic, 并制定loginKey + * @param loginKey . + */ + public StpLogic(String loginKey) { + this.loginKey = loginKey; } + // =================== 获取token 相关 =================== @@ -50,51 +57,49 @@ public class StpLogic { */ public String getTokenValue(){ // 0、获取相应对象 - HttpServletRequest request = SpringMVCUtil.getRequest(); + HttpServletRequest request = SpringMvcUtil.getRequest(); SaTokenConfig config = SaTokenManager.getConfig(); - String key_tokenName = getKey_tokenName(); + String keyTokenName = getKeyTokenName(); // 1、尝试从request里读取 - if(request.getAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY) != null) { - return String.valueOf(request.getAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY)); + if(request.getAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY) != null) { + return String.valueOf(request.getAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY)); } - - // 2、尝试从cookie里读取 - Cookie cookie = SaCookieUtil.getCookie(request, key_tokenName); - if(cookie != null){ - String tokenValue = cookie.getValue(); + // 2、尝试从请求体里面读取 + if(config.getIsReadBody() == true){ + String tokenValue = request.getParameter(keyTokenName); if(tokenValue != null) { return tokenValue; } } - // 3、尝试从header力读取 if(config.getIsReadHead() == true){ - String tokenValue = request.getHeader(key_tokenName); + String tokenValue = request.getHeader(keyTokenName); if(tokenValue != null) { return tokenValue; } } - - // 4、尝试从请求体里面读取 - if(config.getIsReadBody() == true){ - String tokenValue = request.getParameter(key_tokenName); - if(tokenValue != null) { - return tokenValue; + // 4、尝试从cookie里读取 + if(config.getIsReadCookie() == true){ + Cookie cookie = SaCookieUtil.getCookie(request, keyTokenName); + if(cookie != null){ + String tokenValue = cookie.getValue(); + if(tokenValue != null) { + return tokenValue; + } } } - // 5、都读取不到,那算了吧还是 return null; } /** * 获取指定id的tokenValue - * @param login_id + * @param loginId . * @return */ - public String getTokenValueByLoginId(Object login_id) { - return SaTokenManager.getDao().getValue(getKey_LoginId(login_id)); + public String getTokenValueByLoginId(Object loginId) { + return SaTokenManager.getDao().getValue(getKeyLoginId(loginId)); } /** @@ -103,7 +108,7 @@ public class StpLogic { */ public Map getTokenInfo() { Map map = new HashMap(); - map.put("tokenName", getKey_tokenName()); + map.put("tokenName", getKeyTokenName()); map.put("tokenValue", getTokenValue()); return map; } @@ -113,61 +118,66 @@ public class StpLogic { /** * 在当前会话上登录id - * @param login_id 登录id ,建议的类型:(long | int | String) + * @param loginId 登录id ,建议的类型:(long | int | String) */ - public void setLoginId(Object login_id) { + public void setLoginId(Object loginId) { // 1、获取相应对象 - HttpServletRequest request = SpringMVCUtil.getRequest(); + HttpServletRequest request = SpringMvcUtil.getRequest(); SaTokenConfig config = SaTokenManager.getConfig(); SaTokenDao dao = SaTokenManager.getDao(); // 2、获取tokenValue - String tokenValue = getTokenValueByLoginId(login_id); // 获取旧tokenValue + String tokenValue = getTokenValueByLoginId(loginId); // 获取旧tokenValue if(tokenValue == null){ // 为null则创建一个新的 tokenValue = randomTokenValue(); } else { // 不为null, 并且配置不共享,则删掉原来,并且创建新的 if(config.getIsShare() == false){ - dao.delKey(getKey_TokenValue(tokenValue)); + dao.delKey(getKeyTokenValue(tokenValue)); tokenValue = randomTokenValue(); } } // 3、持久化 - dao.setValue(getKey_TokenValue(tokenValue), String.valueOf(login_id), config.getTimeout()); // token -> uid - dao.setValue(getKey_LoginId(login_id), tokenValue, config.getTimeout()); // uid -> token - request.setAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY, tokenValue); // 保存到本次request里 - SaCookieUtil.addCookie(SpringMVCUtil.getResponse(), getKey_tokenName(), tokenValue, "/", (int)config.getTimeout()); // cookie注入 + dao.setValue(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout()); // token -> uid + dao.setValue(getKeyLoginId(loginId), tokenValue, config.getTimeout()); // uid -> token + request.setAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY, tokenValue); // 保存到本次request里 + if(config.getIsReadCookie() == true){ + SaCookieUtil.addCookie(SpringMvcUtil.getResponse(), getKeyTokenName(), tokenValue, "/", (int)config.getTimeout()); // cookie注入 + } } /** * 当前会话注销登录 */ public void logout() { - Object login_id = getLoginId_defaultNull(); - if(login_id != null) { - logoutByLoginId(login_id); - SaCookieUtil.delCookie(SpringMVCUtil.getRequest(), SpringMVCUtil.getResponse(), getKey_tokenName()); // 清除cookie + Object loginId = getLoginIdDefaultNull(); + if(loginId != null) { + logoutByLoginId(loginId); + // 清除cookie + if(SaTokenManager.getConfig().getIsReadCookie() == true){ + SaCookieUtil.delCookie(SpringMvcUtil.getRequest(), SpringMvcUtil.getResponse(), getKeyTokenName()); + } } } /** - * 指定login_id的会话注销登录(踢人下线) - * @param login_id 账号id + * 指定loginId的会话注销登录(踢人下线) + * @param loginId 账号id */ - public void logoutByLoginId(Object login_id) { + public void logoutByLoginId(Object loginId) { // 获取相应tokenValue - String tokenValue = getTokenValueByLoginId(login_id); + String tokenValue = getTokenValueByLoginId(loginId); if(tokenValue == null) { return; } // 清除相关数据 - SaTokenManager.getDao().delKey(getKey_TokenValue(tokenValue)); // 清除token-id键值对 - SaTokenManager.getDao().delKey(getKey_LoginId(login_id)); // 清除id-token键值对 - SaTokenManager.getDao().delKey(getKey_session(login_id)); // 清除其session + SaTokenManager.getDao().delKey(getKeyTokenValue(tokenValue)); // 清除token-id键值对 + SaTokenManager.getDao().delKey(getKeyLoginId(loginId)); // 清除id-token键值对 + SaTokenManager.getDao().delKey(getKeySession(loginId)); // 清除其session // SaCookieUtil.delCookie(SpringMVCUtil.getRequest(), SpringMVCUtil.getResponse(), getKey_tokenName()); // 清除cookie } @@ -178,7 +188,7 @@ public class StpLogic { * @return 是否已登录 */ public boolean isLogin() { - return getLoginId_defaultNull() != null; + return getLoginIdDefaultNull() != null; } /** @@ -190,49 +200,49 @@ public class StpLogic { /** * 获取当前会话登录id, 如果未登录,则抛出异常 - * @return + * @return . */ public Object getLoginId() { - Object login_id = getLoginId_defaultNull(); - if(login_id == null) { - throw new NotLoginException(this.login_key); + Object loginId = getLoginIdDefaultNull(); + if(loginId == null) { + throw new NotLoginException(this.loginKey); } - return login_id; + return loginId; } /** * 获取当前会话登录id, 如果未登录,则返回默认值 - * @param default_value + * @param defaultValue . * @return */ @SuppressWarnings("unchecked") - public T getLoginId(T default_value) { - Object login_id = getLoginId_defaultNull(); - if(login_id == null) { - return default_value; + public T getLoginId(T defaultValue) { + Object loginId = getLoginIdDefaultNull(); + if(loginId == null) { + return defaultValue; } - if(default_value instanceof Integer) { - return (T)Integer.valueOf(login_id.toString()); + if(defaultValue instanceof Integer) { + return (T)Integer.valueOf(loginId.toString()); } - if(default_value instanceof Long) { - return (T)Long.valueOf(login_id.toString()); + if(defaultValue instanceof Long) { + return (T)Long.valueOf(loginId.toString()); } - if(default_value instanceof String) { - return (T)login_id.toString(); + if(defaultValue instanceof String) { + return (T)loginId.toString(); } - return (T)login_id; + return (T)loginId; } /** * 获取当前会话登录id, 如果未登录,则返回null * @return */ - public Object getLoginId_defaultNull() { + public Object getLoginIdDefaultNull() { String tokenValue = getTokenValue(); if(tokenValue != null) { - Object login_id = SaTokenManager.getDao().getValue(getKey_TokenValue(tokenValue)); - if(login_id != null) { - return login_id; + Object loginId = SaTokenManager.getDao().getValue(getKeyTokenValue(tokenValue)); + if(loginId != null) { + return loginId; } } return null; @@ -242,7 +252,7 @@ public class StpLogic { * 获取当前会话登录id, 并转换为String * @return */ - public String getLoginId_asString() { + public String getLoginIdAsString() { return String.valueOf(getLoginId()); } @@ -250,10 +260,10 @@ public class StpLogic { * 获取当前会话登录id, 并转换为int * @return */ - public int getLoginId_asInt() { - // Object login_id = getLoginId(); -// if(login_id instanceof Integer) { -// return (Integer)login_id; + public int getLoginIdAsInt() { + // Object loginId = getLoginId(); +// if(loginId instanceof Integer) { +// return (Integer)loginId; // } return Integer.valueOf(String.valueOf(getLoginId())); } @@ -262,23 +272,23 @@ public class StpLogic { * 获取当前会话登录id, 并转换为long * @return */ - public long getLoginId_asLong() { -// Object login_id = getLoginId(); -// if(login_id instanceof Long) { -// return (Long)login_id; + public long getLoginIdAsLong() { +// Object loginId = getLoginId(); +// if(loginId instanceof Long) { +// return (Long)loginId; // } return Long.valueOf(String.valueOf(getLoginId())); } /** * 获取指定token对应的登录id,如果未登录,则返回 null - * @return + * @return . */ public Object getLoginIdByToken(String tokenValue) { if(tokenValue != null) { - Object login_id = SaTokenManager.getDao().getValue(getKey_TokenValue(tokenValue)); - if(login_id != null) { - return login_id; + Object loginId = SaTokenManager.getDao().getValue(getKeyTokenValue(tokenValue)); + if(loginId != null) { + return loginId; } } return null; @@ -288,14 +298,14 @@ public class StpLogic { // =================== session相关 =================== /** - * 获取指定key的session, 如果没有,is_create=是否新建并返回 - * @param sessionId - * @param is_create - * @return + * 获取指定key的session, 如果没有,isCreate=是否新建并返回 + * @param sessionId . + * @param isCreate . + * @return . */ - protected SaSession getSessionBySessionId(String sessionId, boolean is_create) { + protected SaSession getSessionBySessionId(String sessionId, boolean isCreate) { SaSession session = SaTokenManager.getDao().getSaSession(sessionId); - if(session == null && is_create) { + if(session == null && isCreate) { session = new SaSession(sessionId); SaTokenManager.getDao().saveSaSession(session, SaTokenManager.getConfig().getTimeout()); } @@ -303,20 +313,30 @@ public class StpLogic { } /** - * 获取指定login_id的session - * @param login_id - * @return + * 获取指定loginId的session, 如果没有,isCreate=是否新建并返回 + * @param loginId 登录id + * @param isCreate 是否新建 + * @return SaSession */ - public SaSession getSessionByLoginId(Object login_id) { - return getSessionBySessionId(getKey_session(login_id), false); + public SaSession getSessionByLoginId(Object loginId, boolean isCreate) { + return getSessionBySessionId(getKeySession(loginId), isCreate); } + /** + * 获取指定loginId的session + * @param loginId . + * @return . + */ + public SaSession getSessionByLoginId(Object loginId) { + return getSessionByLoginId(getKeySession(loginId), false); + } + /** * 获取当前会话的session * @return */ public SaSession getSession() { - return getSessionBySessionId(getKey_session(getLoginId()), true); + return getSessionBySessionId(getKeySession(getLoginId()), true); } @@ -324,20 +344,20 @@ public class StpLogic { // =================== 权限验证操作 =================== /** - * 指定login_id是否含有指定权限 - * @param login_id - * @param pcode - * @return + * 指定loginId是否含有指定权限 + * @param loginId . + * @param pcode . + * @return . */ - public boolean hasPermission(Object login_id, Object pcode) { - List pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key); + public boolean hasPermission(Object loginId, Object pcode) { + List pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey); return !(pcodeList == null || pcodeList.contains(pcode) == false); } /** * 当前会话是否含有指定权限 - * @param pcode - * @return + * @param pcode . + * @return . */ public boolean hasPermission(Object pcode) { return hasPermission(getLoginId(), pcode); @@ -345,42 +365,42 @@ public class StpLogic { /** * 当前账号是否含有指定权限 , 没有就抛出异常 - * @param pcode + * @param pcode . */ public void checkPermission(Object pcode) { if(hasPermission(pcode) == false) { - throw new NotPermissionException(pcode, this.login_key); + throw new NotPermissionException(pcode, this.loginKey); } } /** * 当前账号是否含有指定权限 , 【指定多个,必须全都有】 - * @param pcodeArray + * @param pcodeArray . */ public void checkPermissionAnd(Object... pcodeArray){ - Object login_id = getLoginId(); - List pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key); + Object loginId = getLoginId(); + List pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey); for (Object pcode : pcodeArray) { if(pcodeList.contains(pcode) == false) { - throw new NotPermissionException(pcode, this.login_key); // 没有权限抛出异常 + throw new NotPermissionException(pcode, this.loginKey); // 没有权限抛出异常 } } } /** * 当前账号是否含有指定权限 , 【指定多个,有一个就可以了】 - * @param pcodeArray + * @param pcodeArray . */ public void checkPermissionOr(Object... pcodeArray){ - Object login_id = getLoginId(); - List pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key); + Object loginId = getLoginId(); + List pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey); for (Object pcode : pcodeArray) { if(pcodeList.contains(pcode) == true) { return; // 有的话提前退出 } } if(pcodeArray.length > 0) { - throw new NotPermissionException(pcodeArray[0], this.login_key); // 没有权限抛出异常 + throw new NotPermissionException(pcodeArray[0], this.loginKey); // 没有权限抛出异常 } } @@ -391,32 +411,32 @@ public class StpLogic { * 获取key:客户端 tokenName * @return */ - public String getKey_tokenName() { + public String getKeyTokenName() { return SaTokenManager.getConfig().getTokenName(); } /** * 获取key: tokenValue 持久化 - * @param tokenValue + * @param tokenValue . * @return */ - public String getKey_TokenValue(String tokenValue) { - return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":token:" + tokenValue; + public String getKeyTokenValue(String tokenValue) { + return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":token:" + tokenValue; } /** * 获取key: id 持久化 - * @param login_id + * @param loginId . * @return */ - public String getKey_LoginId(Object login_id) { - return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":id:" + login_id; + public String getKeyLoginId(Object loginId) { + return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":id:" + loginId; } /** * 获取key: session 持久化 - * @param login_id - * @return + * @param loginId . + * @return . */ - public String getKey_session(Object login_id) { - return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":session:" + login_id; + public String getKeySession(Object loginId) { + return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":session:" + loginId; } diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpUtil.java index c44d04ca..71a9864b 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -8,11 +8,14 @@ import cn.dev33.satoken.session.SaSession; /** * 一个默认的实现 + * @author kong */ @Service public class StpUtil { - // 底层的 StpLogic 对象 + /** + * 底层的 StpLogic 对象 + */ public static StpLogic stpLogic = new StpLogic("login"); @@ -29,11 +32,11 @@ public class StpUtil { /** * 获取指定id的tokenValue - * @param login_id + * @param loginId . * @return */ - public static String getTokenValueByLoginId(Object login_id) { - return stpLogic.getTokenValueByLoginId(login_id); + public static String getTokenValueByLoginId(Object loginId) { + return stpLogic.getTokenValueByLoginId(loginId); } /** @@ -48,10 +51,10 @@ public class StpUtil { /** * 在当前会话上登录id - * @param login_id 登录id ,建议的类型:(long | int | String) + * @param loginId 登录id ,建议的类型:(long | int | String) */ - public static void setLoginId(Object login_id) { - stpLogic.setLoginId(login_id); + public static void setLoginId(Object loginId) { + stpLogic.setLoginId(loginId); } /** @@ -62,11 +65,11 @@ public class StpUtil { } /** - * 指定login_id的会话注销登录(踢人下线) - * @param login_id 账号id + * 指定loginId的会话注销登录(踢人下线) + * @param loginId 账号id */ - public static void logoutByLoginId(Object login_id) { - stpLogic.logoutByLoginId(login_id); + public static void logoutByLoginId(Object loginId) { + stpLogic.logoutByLoginId(loginId); } // 查询相关 @@ -88,7 +91,7 @@ public class StpUtil { /** * 获取当前会话登录id, 如果未登录,则抛出异常 - * @return + * @return . */ public static Object getLoginId() { return stpLogic.getLoginId(); @@ -96,48 +99,48 @@ public class StpUtil { /** * 获取当前会话登录id, 如果未登录,则返回默认值 - * @param default_value - * @return + * @param defaultValue . + * @return . */ - public static T getLoginId(T default_value) { - return stpLogic.getLoginId(default_value); + public static T getLoginId(T defaultValue) { + return stpLogic.getLoginId(defaultValue); } /** * 获取当前会话登录id, 如果未登录,则返回null * @return */ - public static Object getLoginId_defaultNull() { - return stpLogic.getLoginId_defaultNull(); + public static Object getLoginIdDefaultNull() { + return stpLogic.getLoginIdDefaultNull(); } /** * 获取当前会话登录id, 并转换为String * @return */ - public static String getLoginId_asString() { - return stpLogic.getLoginId_asString(); + public static String getLoginIdAsString() { + return stpLogic.getLoginIdAsString(); } /** * 获取当前会话登录id, 并转换为int * @return */ - public static int getLoginId_asInt() { - return stpLogic.getLoginId_asInt(); + public static int getLoginIdAsInt() { + return stpLogic.getLoginIdAsInt(); } /** * 获取当前会话登录id, 并转换为long * @return */ - public static long getLoginId_asLong() { - return stpLogic.getLoginId_asLong(); + public static long getLoginIdAsLong() { + return stpLogic.getLoginIdAsLong(); } /** * 获取指定token对应的登录id,如果未登录,则返回 null - * @return + * @return . */ public static Object getLoginIdByToken(String tokenValue) { return stpLogic.getLoginIdByToken(tokenValue); @@ -146,14 +149,24 @@ public class StpUtil { // =================== session相关 =================== /** - * 获取指定login_id的session - * @param login_id - * @return + * 获取指定loginId的session, 如果没有,isCreate=是否新建并返回 + * @param loginId 登录id + * @param isCreate 是否新建 + * @return SaSession */ - public static SaSession getSessionByLoginId(Object login_id) { - return stpLogic.getSessionByLoginId(login_id); + public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) { + return stpLogic.getSessionByLoginId(loginId, isCreate); } + /** + * 获取指定loginId的session + * @param loginId . + * @return . + */ + public static SaSession getSessionByLoginId(Object loginId) { + return stpLogic.getSessionByLoginId(loginId); + } + /** * 获取当前会话的session * @return @@ -165,19 +178,19 @@ public class StpUtil { // =================== 权限验证操作 =================== /** - * 指定login_id是否含有指定权限 - * @param login_id - * @param pcode - * @return + * 指定loginId是否含有指定权限 + * @param loginId . + * @param pcode . + * @return . */ - public static boolean hasPermission(Object login_id, Object pcode) { - return stpLogic.hasPermission(login_id, pcode); + public static boolean hasPermission(Object loginId, Object pcode) { + return stpLogic.hasPermission(loginId, pcode); } /** * 当前会话是否含有指定权限 - * @param pcode - * @return + * @param pcode . + * @return . */ public static boolean hasPermission(Object pcode) { return stpLogic.hasPermission(pcode); @@ -185,7 +198,7 @@ public class StpUtil { /** * 当前账号是否含有指定权限 , 没有就抛出异常 - * @param pcode + * @param pcode . */ public static void checkPermission(Object pcode) { stpLogic.checkPermission(pcode); @@ -193,7 +206,7 @@ public class StpUtil { /** * 当前账号是否含有指定权限 , 【指定多个,必须全都有】 - * @param pcodeArray + * @param pcodeArray . */ public static void checkPermissionAnd(Object... pcodeArray) { stpLogic.checkPermissionAnd(pcodeArray); @@ -201,7 +214,7 @@ public class StpUtil { /** * 当前账号是否含有指定权限 , 【指定多个,有一个就可以了】 - * @param pcodeArray + * @param pcodeArray . */ public static void checkPermissionOr(Object... pcodeArray) { stpLogic.checkPermissionOr(pcodeArray); diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaCookieUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaCookieUtil.java index 267d6c37..ab850f24 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaCookieUtil.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaCookieUtil.java @@ -14,10 +14,10 @@ public class SaCookieUtil { /** - * 获取指定cookie - * @param request - * @param cookieName - * @return + * 获取指定cookie . + * @param request . + * @param cookieName . + * @return . */ public static Cookie getCookie(HttpServletRequest request, String cookieName) { Cookie[] cookies = request.getCookies(); @@ -35,11 +35,11 @@ public class SaCookieUtil { /** * 添加cookie - * @param response - * @param name - * @param value - * @param path - * @param timeout + * @param response . + * @param name . + * @param value . + * @param path . + * @param timeout . */ public static void addCookie(HttpServletResponse response,String name,String value,String path,int timeout) { Cookie cookie = new Cookie(name, value); @@ -53,10 +53,10 @@ public class SaCookieUtil { /** - * 删除cookie - * @param request - * @param response - * @param name + * 删除cookie . + * @param request . + * @param response . + * @param name . */ public static void delCookie(HttpServletRequest request,HttpServletResponse response,String name) { Cookie[] cookies = request.getCookies(); @@ -73,10 +73,10 @@ public class SaCookieUtil { /** * 修改cookie的value值 - * @param request - * @param response - * @param name - * @param value + * @param request . + * @param response . + * @param name . + * @param value . */ public static void updateCookie(HttpServletRequest request,HttpServletResponse response,String name,String value) { Cookie[] cookies = request.getCookies(); diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java new file mode 100644 index 00000000..0f9102af --- /dev/null +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java @@ -0,0 +1,40 @@ +package cn.dev33.satoken.util; + +/** + * sa-token 工具类 + * @author kong + * + */ +public class SaTokenInsideUtil { + + + /** + * sa-token 版本号 + */ + public static final String VERSION_NO = "v1.4.0"; + + /** + * sa-token 开源地址 + */ + public static final String GITHUB_URL= "https://github.com/click33/sa-token"; + + /** + * 打印 sa-token + */ + public static void printSaToken() { + String str = + "____ ____ ___ ____ _ _ ____ _ _ \r\n" + + "[__ |__| __ | | | |_/ |___ |\\ | \r\n" + + "___] | | | |__| | \\_ |___ | \\| \r\n" + + "sa-token:" + VERSION_NO + " \r\n" + + "GitHub:" + GITHUB_URL; // + "\r\n"; + System.out.println(str); + } + + /** + * 如果token为本次请求新创建的,则以此字符串为key存储在当前request中 JUST_CREATED_SAVE_KEY + */ + public static final String JUST_CREATED_SAVE_KEY = "JUST_CREATED_SAVE_KEY_"; + + +} diff --git a/sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMVCUtil.java b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMvcUtil.java similarity index 97% rename from sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMVCUtil.java rename to sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMvcUtil.java index ef82c581..d89e10d7 100644 --- a/sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMVCUtil.java +++ b/sa-token-dev/src/main/java/cn/dev33/satoken/util/SpringMvcUtil.java @@ -11,7 +11,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; * @author kong * */ -public class SpringMVCUtil { +public class SpringMvcUtil { /** * 获取当前会话的 request @@ -37,4 +37,7 @@ public class SpringMVCUtil { return servletRequestAttributes.getResponse(); } + + + } diff --git a/sa-token-dev/src/main/java/com/pj/SaTokenApplication.java b/sa-token-dev/src/main/java/com/pj/SaTokenApplication.java deleted file mode 100644 index 472af75a..00000000 --- a/sa-token-dev/src/main/java/com/pj/SaTokenApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pj; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import cn.dev33.satoken.SaTokenManager; -import cn.dev33.satoken.spring.SaTokenSetup; - -@SaTokenSetup // 标注启动 sa-token -@SpringBootApplication -public class SaTokenApplication { - - public static void main(String[] args) { - SpringApplication.run(SaTokenApplication.class, args); // run--> - System.out.println(SaTokenManager.getConfig()); - } - -} \ No newline at end of file diff --git a/sa-token-dev/src/main/resources/application.yml b/sa-token-dev/src/main/resources/application.yml deleted file mode 100644 index 835fdf29..00000000 --- a/sa-token-dev/src/main/resources/application.yml +++ /dev/null @@ -1,20 +0,0 @@ -# 端口 -server: - port: 8081 - -spring: - # sa-token配置 - sa-token: - # token名称(同时也是cookie名称) - token-name: satoken - # token有效期,单位s 默认30天 - timeout: 2592000 - # 在多人登录同一账号时,是否共享会话(为true时共用一个,为false时新登录挤掉旧登录) - is-share: true - # 是否在cookie读取不到token时,继续从请求header里继续尝试读取 - is-read-head: true - # 是否在header读取不到token时,继续从请求题参数里继续尝试读取 - is-read-body: true - # 是否在初始化配置时打印版本字符画 - is-v: true - \ No newline at end of file diff --git a/sa-token-doc/doc/README.md b/sa-token-doc/doc/README.md index eda6ddc5..3c8d3b25 100644 --- a/sa-token-doc/doc/README.md +++ b/sa-token-doc/doc/README.md @@ -1,12 +1,25 @@ -# sa-token +

+ logo +

+

sa-token v1.4.0

+

一个JavaWeb权限认证框架,强大、简单、好用

+

+ + + + + + + +

-一个JavaWeb权限认证框架,强大、简单、好用 -在线文档:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) +--- + +## sa-token 😋 +- 在线文档:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) +- 需求提交:我们深知一个优秀的项目需要海纳百川,[点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token) - :kissing_closed_eyes: :kissing_closed_eyes: :kissing_closed_eyes: :yum: :yum: :yum: :innocent: :innocent: :innocent: :heart: :heart: :heart: - - -## 优点 +## 框架优点 与其它权限认证框架相比,sa-token尽力保证两点: - 上手简单:能自动化的配置全部自动化,不让你费脑子 - 功能强大:能涵盖的功能全部涵盖,不让你用个框架还要自己给框架打各种补丁 @@ -24,9 +37,6 @@ - 零配置与Spring等框架集成 - ... -## 需求提交 -- 我们深知一个优秀的项目需要海纳百川,[点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token) - ## 贡献代码 1. 在github上fork一份到自己的仓库 2. clone自己的仓库到本地电脑 diff --git a/sa-token-doc/doc/index.html b/sa-token-doc/doc/index.html index cc7c42d8..085e2e38 100644 --- a/sa-token-doc/doc/index.html +++ b/sa-token-doc/doc/index.html @@ -28,7 +28,7 @@
加载中...