From 9fe0e1f97b554f7037ad8f872657222ffec1e0aa Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Thu, 11 Mar 2021 01:06:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/dev33/satoken/stp/SaLoginModel.java | 59 +++++++++++------- .../main/java/com/pj/test/TestController.java | 6 +- sa-token-doc/doc/_sidebar.md | 1 + sa-token-doc/doc/fun/session-model.md | 21 +++++++ sa-token-doc/doc/static/kickout.png | Bin 0 -> 15774 bytes sa-token-doc/doc/static/not-jur.png | Bin 0 -> 11460 bytes sa-token-doc/doc/static/not-login.png | Bin 0 -> 10601 bytes sa-token-doc/doc/static/session-model.png | Bin 0 -> 30028 bytes sa-token-doc/doc/use/jur-auth.md | 4 +- sa-token-doc/doc/use/kick.md | 2 + sa-token-doc/doc/use/login-auth.md | 1 + sa-token-doc/doc/use/remember-me.md | 19 ++++++ sa-token-doc/doc/use/session.md | 2 + 13 files changed, 89 insertions(+), 26 deletions(-) create mode 100644 sa-token-doc/doc/fun/session-model.md create mode 100644 sa-token-doc/doc/static/kickout.png create mode 100644 sa-token-doc/doc/static/not-jur.png create mode 100644 sa-token-doc/doc/static/not-login.png create mode 100644 sa-token-doc/doc/static/session-model.png diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java index f58666c9..58142793 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java @@ -18,16 +18,16 @@ public class SaLoginModel { */ public String device; - /** - * 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) - */ - public Long timeout; - /** * 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) */ public Boolean isLastingCookie; + /** + * 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) + */ + public Long timeout; + /** * @return device @@ -45,22 +45,6 @@ public class SaLoginModel { return this; } - /** - * @return timeout - */ - public Long getTimeout() { - return timeout; - } - - /** - * @param timeout 要设置的 timeout - * @return 对象自身 - */ - public SaLoginModel setTimeout(long timeout) { - this.timeout = timeout; - return this; - } - /** * @return isLastingCookie */ @@ -77,6 +61,22 @@ public class SaLoginModel { return this; } + /** + * @return timeout + */ + public Long getTimeout() { + return timeout; + } + + /** + * @param timeout 要设置的 timeout + * @return 对象自身 + */ + public SaLoginModel setTimeout(long timeout) { + this.timeout = timeout; + return this; + } + /** * @return cookie时长 @@ -109,12 +109,12 @@ public class SaLoginModel { if(device == null) { device = SaTokenConsts.DEFAULT_LOGIN_DEVICE; } - if(timeout == null) { - timeout = config.getTimeout(); - } if(isLastingCookie == null) { isLastingCookie = true; } + if(timeout == null) { + timeout = config.getTimeout(); + } return this; } @@ -128,4 +128,15 @@ public class SaLoginModel { } + /** + * toString + */ + @Override + public String toString() { + return "SaLoginModel [device=" + device + ", isLastingCookie=" + isLastingCookie + ", timeout=" + timeout + "]"; + } + + + + } 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 291f6c3d..ce27d2b5 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 @@ -238,12 +238,16 @@ public class TestController { return AjaxJson.getSuccessData("登录成功"); } - // 测试 浏览器访问: http://localhost:8081/test/test @RequestMapping("test") public AjaxJson test(HttpServletResponse response) { System.out.println("进来了"); +// StpUtil.setLoginId(10001, new SaLoginModel() +// .setDevice("PC") // 此次登录的客户端设备标识, 用于[同端互斥登录]时指定此次登录的设备名称 +// .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) +// .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) +// ); return AjaxJson.getSuccess("访问成功"); } diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md index b57cb967..749db20b 100644 --- a/sa-token-doc/doc/_sidebar.md +++ b/sa-token-doc/doc/_sidebar.md @@ -35,6 +35,7 @@ - **附录** - [未登录场景值](/fun/not-login-scene) - [token有效期详解](/fun/token-timeout) + - [Session模型详解](/fun/session-model) - [TokenInfo参数详解](/fun/token-info) diff --git a/sa-token-doc/doc/fun/session-model.md b/sa-token-doc/doc/fun/session-model.md new file mode 100644 index 00000000..6ab035d0 --- /dev/null +++ b/sa-token-doc/doc/fun/session-model.md @@ -0,0 +1,21 @@ +# Session模型详解 + +--- + +在`sa-token`中, `Session` 分为三种, 分别是: +- `User-Session`: 指的是框架为每个`loginId`分配的`Session` +- `Token-Session`: 指的是框架为每个`token`分配的`Session` +- `自定义Session`: 指的是以一个`特定的值`作为SessionId,来分配的`Session` + + +User-Session和Token-Session到底有什么不同?下面这张图可以解释两者的区别 + +![../static/session-model.png](../static/session-model.png) + +简而言之: +- `Token-Session` 以token为主,只要token不同,那么对应的Session对象就不同 +- `User-Session` 以UserId为主,只要token指向的UserId一致,那么对应的Session对象就一致 +- `自定义Session` 以特定的key为主,不同key对应不同的Session对象 + + + diff --git a/sa-token-doc/doc/static/kickout.png b/sa-token-doc/doc/static/kickout.png new file mode 100644 index 0000000000000000000000000000000000000000..35a2137b5e7f7e40aecc1454d786ed1677f544c4 GIT binary patch literal 15774 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 W%NG-E1)h+;CNHZjQz~Wj=6?W5U;CH< literal 0 HcmV?d00001 diff --git a/sa-token-doc/doc/static/not-jur.png b/sa-token-doc/doc/static/not-jur.png new file mode 100644 index 0000000000000000000000000000000000000000..6426eb0df186b5f317ed641f2263de19688651ca GIT binary patch literal 11460 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 E2Z0S982|tP literal 0 HcmV?d00001 diff --git a/sa-token-doc/doc/static/not-login.png b/sa-token-doc/doc/static/not-login.png new file mode 100644 index 0000000000000000000000000000000000000000..a3075b9013751179d13f629b132671db361b415e GIT binary patch literal 10601 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 -例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权 `"user:update"`,则结果就是:**验证失败,禁止访问** +例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权限 `"user:update"`,则其结果就是:**验证失败,禁止访问** + +![无权限](../static/not-jur.png) 所以现在问题的核心就是: 1. 如何获取一个账号所拥有的的权限码集合 diff --git a/sa-token-doc/doc/use/kick.md b/sa-token-doc/doc/use/kick.md index ba6b4b3d..1651e4e0 100644 --- a/sa-token-doc/doc/use/kick.md +++ b/sa-token-doc/doc/use/kick.md @@ -1,6 +1,8 @@ # 踢人下线 所谓踢人下线,核心操作就是找到其指定`loginId`对应的`token`,并设置其失效 +![踢下线](../static/kickout.png) + --- diff --git a/sa-token-doc/doc/use/login-auth.md b/sa-token-doc/doc/use/login-auth.md index 08959c94..fc8725a0 100644 --- a/sa-token-doc/doc/use/login-auth.md +++ b/sa-token-doc/doc/use/login-auth.md @@ -7,6 +7,7 @@ 所谓登录验证,说白了就是限制某些接口只有登录后才能访问(如:查询我的账号资料)
那么判断一个会话是否登录的依据是什么?当然是登录成功后框架给你做个标记!然后在需要鉴权的接口里检查此标记,有标记者视为已登录,无标记者视为未登录! +![暂未登录](../static/not-login.png) ### 登录与注销 diff --git a/sa-token-doc/doc/use/remember-me.md b/sa-token-doc/doc/use/remember-me.md index 540501fa..3fcbdfe7 100644 --- a/sa-token-doc/doc/use/remember-me.md +++ b/sa-token-doc/doc/use/remember-me.md @@ -59,4 +59,23 @@ Remember me, it's too easy! +### 登录时指定token有效期 +登录时不仅可以指定是否为`[记住我]`模式,还可以指定一个特定的时间作为token有效时长,如下示例: +``` java +// 示例1: +// 指定token有效期(单位: 秒),如下所示token七天有效 +StpUtil.setLoginId(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7)); + +// ----------------------- 示例2:所有参数 +// `SaLoginModel`为登录参数Model,其有诸多参数决定登录时的各种逻辑,例如: +StpUtil.setLoginId(10001, new SaLoginModel() + .setDevice("PC") // 此次登录的客户端设备标识, 用于[同端互斥登录]时指定此次登录的设备名称 + .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) + .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) + ); +``` + + + + diff --git a/sa-token-doc/doc/use/session.md b/sa-token-doc/doc/use/session.md index c3f86ef4..4d8fc60c 100644 --- a/sa-token-doc/doc/use/session.md +++ b/sa-token-doc/doc/use/session.md @@ -9,6 +9,8 @@ Session是会话中专业的数据缓存组件,通过`Session`我们可以很 - `Token-Session`: 指的是框架为每个`token`分配的`Session` - `自定义Session`: 指的是以一个`特定的值`作为SessionId,来分配的`Session` +> 有关User-Session与Token-Session的详细区别,请参考:[Session模型详解](/fun/session-model) + ### User-Session 有关账号Session的API如下: