From 3bec16627e99b89bbb814d50689f563cf03cb008 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Mon, 11 Oct 2021 01:09:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- .../main/java/cn/dev33/satoken/SaManager.java | 2 +- .../satoken/annotation/SaCheckPermission.java | 4 +- .../java/com/pj/satoken/SaTokenConfigure.java | 12 +- .../src/main/resources/templates/index.html | 4 +- sa-token-doc/doc/README.md | 8 +- sa-token-doc/doc/_sidebar.md | 3 +- sa-token-doc/doc/lib/index.css | 8 + sa-token-doc/doc/more/common-action.md | 1 + sa-token-doc/doc/plugin/thymeleaf-extend.md | 125 +++++++++++++ sa-token-doc/doc/sso/sso-server.md | 10 +- sa-token-doc/doc/sso/sso-type1.md | 8 +- sa-token-doc/doc/sso/sso-type3.md | 2 +- sa-token-doc/doc/up/global-listener.md | 5 +- sa-token-doc/doc/up/many-account.md | 53 ++---- sa-token-doc/doc/up/mock-person.md | 4 +- sa-token-doc/doc/up/mutex-login.md | 8 +- sa-token-doc/doc/up/token-style.md | 70 ++------ sa-token-doc/doc/use/at-check.md | 20 ++- sa-token-doc/doc/use/config.md | 20 ++- sa-token-doc/doc/use/jur-auth.md | 16 +- sa-token-doc/doc/use/kick.md | 27 +-- sa-token-doc/doc/use/route-check.md | 166 ++++++++++-------- 23 files changed, 352 insertions(+), 232 deletions(-) create mode 100644 sa-token-doc/doc/plugin/thymeleaf-extend.md diff --git a/README.md b/README.md index a69d3a5b..6c4f21f7 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,8 @@ public String insert(SysUser user) { 将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常) ``` java -// 使账号id为 10001 的会话强制注销登录 -StpUtil.logoutByLoginId(10001); +// 将账号id为 10001 的会话踢下线 +StpUtil.kickout(10001); ``` 在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成: @@ -66,14 +66,14 @@ StpUtil.login(10001); // 标记当前会话登录的账号id StpUtil.getLoginId(); // 获取当前会话登录的账号id StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false StpUtil.logout(); // 当前会话注销登录 -StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线) +StpUtil.kickout(10001); // 将账号为10001的会话踢下线 StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false StpUtil.getSession(); // 获取当前账号id的Session StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值 StpUtil.login(10001, "PC"); // 指定设备标识登录,常用于“同端互斥登录” -StpUtil.logoutByLoginId(10001, "PC"); // 指定设备标识进行强制注销 (不同端不受影响) +StpUtil.kickout(10001, "PC"); // 指定账号指定设备标识踢下线 (不同端不受影响) StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒 StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常 StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 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 850fa360..b6cfc10b 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 @@ -111,7 +111,7 @@ public class SaManager { } /** - * 容器操作 Bean + * 上下文 Bean */ private volatile static SaTokenContext saTokenContext; public static void setSaTokenContext(SaTokenContext saTokenContext) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java index b507bd95..7abe3b86 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java @@ -42,8 +42,8 @@ public @interface SaCheckPermission { *
* *
- * 例2: orRole={"admin", "manager", "staff"},具有三个角色其一即可
- * 例3: orRole={"admin, manager, staff"},必须三个角色同时具备
+ * 例2: orRole = {"admin", "manager", "staff"},具有三个角色其一即可
+ * 例3: orRole = {"admin, manager, staff"},必须三个角色同时具备
*
登录之后才能显示:value
-不登录之后才能显示:value
+不登录才能显示:value
具有角色 admin 才能显示:value
同时具备多个角色才能显示:value
@@ -28,7 +28,7 @@从SaSession中取值: - +
diff --git a/sa-token-doc/doc/README.md b/sa-token-doc/doc/README.md index 05e60d8d..bef14a9c 100644 --- a/sa-token-doc/doc/README.md +++ b/sa-token-doc/doc/README.md @@ -58,8 +58,8 @@ public String insert(SysUser user) { 将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常) ``` java -// 使账号id为 10001 的会话强制注销登录 -StpUtil.logoutByLoginId(10001); +// 将账号id为 10001 的会话踢下线 +StpUtil.kickout(10001); ``` 在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成: @@ -68,14 +68,14 @@ StpUtil.login(10001); // 标记当前会话登录的账号id StpUtil.getLoginId(); // 获取当前会话登录的账号id StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false StpUtil.logout(); // 当前会话注销登录 -StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线) +StpUtil.kickout(10001); // 将账号为10001的会话踢下线 StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false StpUtil.getSession(); // 获取当前账号id的Session StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值 StpUtil.login(10001, "PC"); // 指定设备标识登录,常用于“同端互斥登录” -StpUtil.logoutByLoginId(10001, "PC"); // 指定设备标识进行强制注销 (不同端不受影响) +StpUtil.kickout(10001, "PC"); // 指定账号指定设备标识踢下线 (不同端不受影响) StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒 StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常 StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md index 8482b98c..04d39842 100644 --- a/sa-token-doc/doc/_sidebar.md +++ b/sa-token-doc/doc/_sidebar.md @@ -29,7 +29,7 @@ - [会话治理](/up/search-session) - [全局侦听器](/up/global-listener) - [全局过滤器](/up/global-filter) - - [多账号验证](/up/many-account) + - [多账号认证](/up/many-account) - **单点登录** @@ -63,6 +63,7 @@ - [Quick-Login快速登录插件](/plugin/quick-login) - [Alone独立Redis插件](/plugin/alone-redis) - [持久层扩展](/plugin/dao-extend) + - [和 Thymeleaf 集成](/plugin/thymeleaf-extend) - **其它** - [更新日志](/more/update-log) diff --git a/sa-token-doc/doc/lib/index.css b/sa-token-doc/doc/lib/index.css index 824a01ce..93c1a9b3 100644 --- a/sa-token-doc/doc/lib/index.css +++ b/sa-token-doc/doc/lib/index.css @@ -61,6 +61,14 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .lang-xml .token.tag *{color: #db2d20;} .lang-xml .token.attr-value{color: #A6E22E;} +/* html语言样式优化 */ +.lang-html .token.comment{color: #CDAB53;} +.lang-html .token.tag *{color: #db2d20;} +.lang-html .token.tag .attr-name, +.lang-html .token.tag .attr-name *{color: #A6E22E; opacity: 0.9;} +.lang-html .token.tag .attr-value, +.lang-html .token.tag .attr-value *{color: #E6DB74; opacity: 0.9;} + /* java语言样式优化 */ .main-box .lang-java{color: #01a252 !important;; opacity: 1;} .lang-java .token.keyword{color: #db2d20;} diff --git a/sa-token-doc/doc/more/common-action.md b/sa-token-doc/doc/more/common-action.md index 2e7299ad..a6796af7 100644 --- a/sa-token-doc/doc/more/common-action.md +++ b/sa-token-doc/doc/more/common-action.md @@ -12,6 +12,7 @@ SaManager.getStpInterface(); // 获取权限认证对象 SaManager.getSaTokenAction(); // 获取框架行为对象 SaManager.getSaTokenContext(); // 获取上下文处理对象 SaManager.getSaTokenListener(); // 获取侦听器对象 +SaManager.getSaTemp(); // 获取临时令牌验证模块对象 SaManager.getStpLogic("type"); // 获取指定账号类型的StpLogic对象 ``` diff --git a/sa-token-doc/doc/plugin/thymeleaf-extend.md b/sa-token-doc/doc/plugin/thymeleaf-extend.md new file mode 100644 index 00000000..e33a7dd4 --- /dev/null +++ b/sa-token-doc/doc/plugin/thymeleaf-extend.md @@ -0,0 +1,125 @@ +# Thymeleaf 标签方言 + +本插件的作用是让我们可以在 Thymeleaf 页面中使用 Sa-Token 相关API,俗称 —— 标签方言。 + +--- + +### 1、引入依赖 +首先我们确保项目已经引入 Thymeleaf 依赖,然后在此基础上继续添加: + +``` xml + ++ 登录之后才能显示: + value +
++ 不登录才能显示: + value +
+``` + +##### 3.2、角色判断 +``` html ++ 具有角色 admin 才能显示: + value +
++ 同时具备多个角色才能显示: + value +
++ 只要具有其中一个角色就能显示: + value +
++ 不具有角色 admin 才能显示: + value +
+``` + +##### 3.3、权限判断 +``` html ++ 具有权限 user-add 才能显示: + value +
++ 同时具备多个权限才能显示: + value +
++ 只要具有其中一个权限就能显示: + value +
++ 不具有权限 user-add 才能显示: + value +
+``` + + +### 4、调用 Sa-Token 相关API + +以上的标签方言,可以满足我们大多数场景下的权限判断,然后有时候我们依然需要更加灵活的在页面中调用 Sa-Token 框架API + +首先在 SaTokenConfigure 配置类中为 Thymeleaf 配置全局对象: + +``` java +public class SaTokenConfigure{ + // ... 其它代码 + + // 为 Thymeleaf 注入全局变量,以便在页面中调用 Sa-Token 的方法 + @Autowired + private void configureThymeleafStaticVars(ThymeleafViewResolver viewResolver) { + viewResolver.addStaticVariable("stp", StpUtil.stpLogic); + } +} +``` + +然后我们就可以在页面上调用 StpLogic 的 API 了,例如: + +``` html +调用 StpLogic 方法调用测试
++ 从SaSession中取值: + +
+``` + + + + + + + + diff --git a/sa-token-doc/doc/sso/sso-server.md b/sa-token-doc/doc/sso/sso-server.md index 6bbc2b95..b998bc91 100644 --- a/sa-token-doc/doc/sso/sso-server.md +++ b/sa-token-doc/doc/sso/sso-server.md @@ -181,16 +181,16 @@ public class SaSsoServerApplication {  -可以看到这个页面非常简陋,这是因为我们以上的代码示例,主要目标是为了带大家从零搭建一个可用的SSO认证服务端,所以就对一些不太必要的步骤做了简化 +可以看到这个页面目前非常简陋,这是因为我们以上的代码示例,主要目标是为了带大家从零搭建一个可用的SSO认证服务端,所以就对一些不太必要的步骤做了简化。 大家可以下载运行一下官方仓库里的示例`/sa-token-demo/sa-token-demo-sso-server/`,里面有制作好的登录页面:  -默认账号密码为:`sa / 123456`,大家先别着急点击登录,因为我们还没有搭建对应的 Client 端项目, +默认账号密码为:`sa / 123456`,先别着急点击登录,因为我们还没有搭建对应的 Client 端项目, 真实项目中我们是不会直接从浏览器访问 `/sso/auth` 授权地址的,我们需要在 Client 端点击登录按钮重定向而来。 -现在我们先来看看除了 `/sso/auth` 统一授权地址,这个 SSO-Server 认证中心还开放了哪些API呢,且往下看 +现在我们先来看看除了 `/sso/auth` 统一授权地址,这个 SSO-Server 认证中心还开放了哪些API。 ### 5、API 列表 @@ -244,7 +244,7 @@ http://{host}:{port}/sso/checkTicket | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | ticket | 是 | 在步骤 5.1 中授权重定向时的 ticket 参数 | -| ssoLogoutCall | 否 | 单点注销时的回调通知地址,只在SSO模式三时需要携带此参数| +| ssoLogoutCall | 否 | 单点注销时的回调通知地址,只在SSO模式三单点注销时需要携带此参数| 返回值场景: - 返回空,代表校验失败。 @@ -267,7 +267,7 @@ http://{host}:{port}/sso/logout 此接口有两种调用方式 -##### 方式一:在前端页面引导用户直接跳转,并带有 back 参数 +##### 方式一:在 Client 的前端页面引导用户直接跳转,并带有 back 参数 例如:`http://{host}:{port}/sso/logout?back=xxx`,代表用户注销成功后返回back地址 ##### 方式二:在 Client 的后端通过 http 工具来调用 diff --git a/sa-token-doc/doc/sso/sso-type1.md b/sa-token-doc/doc/sso/sso-type1.md index 5dc420b5..b17b583c 100644 --- a/sa-token-doc/doc/sso/sso-type1.md +++ b/sa-token-doc/doc/sso/sso-type1.md @@ -40,17 +40,19 @@ OK,所有理论就绪,下面开始实战: ``` yml sa-token: cookie: - # 配置Cookie作用域 (这个配置原本是被注释掉的,现在我们将其打开) + # 配置Cookie作用域 domain: stp.com ``` -注:在SSO模式一测试完毕之后,一定要将这个配置再次注释掉,因为模式一与模式二三使用不同的授权流程,这行配置会影响到我们模式二和模式三的正常运行。 +这个配置原本是被注释掉的,现在将其打开。另外我们格外需要注意: +在SSO模式一测试完毕之后,一定要将这个配置再次注释掉,因为模式一与模式二三使用不同的授权流程,这行配置会影响到我们模式二和模式三的正常运行。 + ### 4、搭建 Client 端项目 -> 整合示例在官方仓库的 `/sa-token-demo/sa-token-demo-sso1-client/`,如遇到难点可结合源码进行测试学习。 +> 搭建示例在官方仓库的 `/sa-token-demo/sa-token-demo-sso1-client/`,如遇到难点可结合源码进行测试学习。 #### 4.1、引入依赖 diff --git a/sa-token-doc/doc/sso/sso-type3.md b/sa-token-doc/doc/sso/sso-type3.md index 0099a389..b9fc6a27 100644 --- a/sa-token-doc/doc/sso/sso-type3.md +++ b/sa-token-doc/doc/sso/sso-type3.md @@ -122,7 +122,7 @@ public Object myinfo() { 5. Server 端注销下线。 6. 单点注销完成。 -这些逻辑 Sa-Token 内部已经封装完毕,你只需按照文章增加以下配置即可: +这些逻辑 Sa-Token 内部已经封装完毕,你只需按照文档增加以下配置即可: #### 4.1、SSO-Client 端新增配置 diff --git a/sa-token-doc/doc/up/global-listener.md b/sa-token-doc/doc/up/global-listener.md index ff5a83f5..b352abee 100644 --- a/sa-token-doc/doc/up/global-listener.md +++ b/sa-token-doc/doc/up/global-listener.md @@ -12,6 +12,7 @@ ### 自定义侦听器实现 新建`MySaTokenListener.java`,继承`SaTokenListener`接口,并添加上注解`@Component`,保证此类被`SpringBoot`扫描到 + ``` java /** * 自定义侦听器的实现 @@ -33,13 +34,13 @@ public class MySaTokenListener implements SaTokenListener { /** 每次被踢下线时触发 */ @Override - public void doLogoutByLoginId(String loginType, Object loginId, String tokenValue, String device) { + public void doKickout(String loginType, Object loginId, String tokenValue) { // ... } /** 每次被顶下线时触发 */ @Override - public void doReplaced(String loginType, Object loginId, String tokenValue, String device) { + public void doReplaced(String loginType, Object loginId, String tokenValue) { // ... } diff --git a/sa-token-doc/doc/up/many-account.md b/sa-token-doc/doc/up/many-account.md index e9b72be6..2632dbc7 100644 --- a/sa-token-doc/doc/up/many-account.md +++ b/sa-token-doc/doc/up/many-account.md @@ -1,4 +1,4 @@ -# 多账号验证 +# 多账号认证 --- ### 0、需求场景 @@ -80,48 +80,20 @@ public String info() { 我们期待一种`[注解继承/合并]`的能力,即:自定义一个注解,标注上`@SaCheckLogin(type = "user")`,然后在方法上标注这个自定义注解,效果等同于标注`@SaCheckLogin(type = "user")` -很遗憾,JDK默认的注解处理器并没有提供这种`[注解继承/合并]`的能力,不过好在我们可以利用Spring的注解处理器,达到同样的目的 +很遗憾,JDK默认的注解处理器并没有提供这种`[注解继承/合并]`的能力,不过好在我们可以利用 Spring 的注解处理器,达到同样的目的 1. 重写Sa-Token默认的注解处理器 ``` java -/** - * 继承Sa-Token行为Bean默认实现, 重写部分逻辑 - */ -@Component -public class MySaTokenAction extends SaTokenActionDefaultImpl { - - /** - * 重写Sa-Token的注解处理器,加强注解合并功能 - */ - @Override - protected void validateAnnotation(AnnotatedElement target) { - - // 校验 @SaCheckLogin 注解 - if(AnnotatedElementUtils.isAnnotated(target, SaCheckLogin.class)) { - SaCheckLogin at = AnnotatedElementUtils.getMergedAnnotation(target, SaCheckLogin.class); - SaManager.getStpLogic(at.type()).checkByAnnotation(at); - } - - // 校验 @SaCheckRole 注解 - if(AnnotatedElementUtils.isAnnotated(target, SaCheckRole.class)) { - SaCheckRole at = AnnotatedElementUtils.getMergedAnnotation(target, SaCheckRole.class); - SaManager.getStpLogic(at.type()).checkByAnnotation(at); - } - - // 校验 @SaCheckPermission 注解 - if(AnnotatedElementUtils.isAnnotated(target, SaCheckPermission.class)) { - SaCheckPermission at = AnnotatedElementUtils.getMergedAnnotation(target, SaCheckPermission.class); - SaManager.getStpLogic(at.type()).checkByAnnotation(at); - } - - // 校验 @SaCheckSafe 注解 - if(AnnotatedElementUtils.isAnnotated(target, SaCheckSafe.class)) { - SaCheckSafe at = AnnotatedElementUtils.getMergedAnnotation(target, SaCheckSafe.class); - SaManager.getStpLogic(null).checkByAnnotation(at); - } - } - +@Configuration +public class SaTokenConfigure { + @Autowired + public void rewriteSaStrategy() { + // 重写Sa-Token的注解处理器,增加注解合并功能 + SaStrategy.me.getAnnotation = (element, annotationClass) -> { + return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass); + }; + } } ``` @@ -184,6 +156,3 @@ public class StpUserUtil { 再次调用 `StpUserUtil.login(10001)` 进行登录授权时,token的名称将不再是 `satoken`,而是我们重写后的 `satoken-user` - - -> 不同体系账号在登录时设置不同的token有效期等信息,详见[登录时指定token有效期](/up/remember-me?id=登录时指定token有效期) \ No newline at end of file diff --git a/sa-token-doc/doc/up/mock-person.md b/sa-token-doc/doc/up/mock-person.md index b6432a86..9743d70e 100644 --- a/sa-token-doc/doc/up/mock-person.md +++ b/sa-token-doc/doc/up/mock-person.md @@ -14,8 +14,8 @@ Sa-Token在api设计时充分考虑了这一点,暴露出多个api进行此类 // 获取指定账号10001的`tokenValue`值 StpUtil.getTokenValueByLoginId(10001); -// 将账号10001的会话注销登录(踢人下线) -StpUtil.logoutByLoginId(10001); +// 将账号10001的会话注销登录 +StpUtil.logout(10001); // 获取账号10001的Session对象, 如果session尚未创建, 则新建并返回 StpUtil.getSessionByLoginId(10001); diff --git a/sa-token-doc/doc/up/mutex-login.md b/sa-token-doc/doc/up/mutex-login.md index 308f0c57..72300661 100644 --- a/sa-token-doc/doc/up/mutex-login.md +++ b/sa-token-doc/doc/up/mutex-login.md @@ -21,10 +21,10 @@ StpUtil.login(10001, "PC"); #### 指定设备标识强制注销 ``` java -// 指定`账号id`和`设备标识`进行强制注销 (踢人下线) -StpUtil.logoutByLoginId(10001, "PC"); +// 指定`账号id`和`设备标识`进行强制注销 +StpUtil.logout(10001, "PC"); ``` -如果第二个参数填写null或不填,代表将这个账号id所有在线端踢下线,被踢出者再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-5` +如果第二个参数填写null或不填,代表将这个账号id所有在线端强制注销,被踢出者再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-2` #### 查询当前登录的设备标识 @@ -40,5 +40,3 @@ StpUtil.getLoginDevice(); StpUtil.getTokenValueByLoginId(10001, "APP"); ``` - -> 不同设备账号在登录时设置不同的token有效期等信息, 详见[登录时指定token有效期](/up/remember-me?id=登录时指定token有效期) \ No newline at end of file diff --git a/sa-token-doc/doc/up/token-style.md b/sa-token-doc/doc/up/token-style.md index a4220704..dbd8fdb7 100644 --- a/sa-token-doc/doc/up/token-style.md +++ b/sa-token-doc/doc/up/token-style.md @@ -37,27 +37,24 @@ Sa-Token默认的token生成策略是uuid风格,其模样类似于:`623368f0 如果你觉着以上风格都不是你喜欢的类型,那么你还可以**自定义token生成策略**,来定制化token生成风格