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 00000000..35a2137b Binary files /dev/null and b/sa-token-doc/doc/static/kickout.png differ 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 00000000..6426eb0d Binary files /dev/null and b/sa-token-doc/doc/static/not-jur.png differ 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 00000000..a3075b90 Binary files /dev/null and b/sa-token-doc/doc/static/not-login.png differ diff --git a/sa-token-doc/doc/static/session-model.png b/sa-token-doc/doc/static/session-model.png new file mode 100644 index 00000000..4e2dfcae Binary files /dev/null and b/sa-token-doc/doc/static/session-model.png differ diff --git a/sa-token-doc/doc/use/jur-auth.md b/sa-token-doc/doc/use/jur-auth.md index 8763a95d..9fea529f 100644 --- a/sa-token-doc/doc/use/jur-auth.md +++ b/sa-token-doc/doc/use/jur-auth.md @@ -8,7 +8,9 @@ 有,就让你通过。没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包含指定的权限码
-例如:当前账号拥有权限码集合:`["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如下: