diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml index babc1766..4d405497 100644 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml @@ -4,9 +4,9 @@ server: # Sa-Token 配置 sa-token: - # -------------- SSO-模式一相关配置 (非模式一不需要配置) + # ------- SSO-模式一相关配置 (非模式一不需要配置) # cookie: - # 配置Cookie作用域 + # 配置 Cookie 作用域 # domain: stp.com # ------- SSO-模式二相关配置 @@ -18,7 +18,7 @@ sa-token: # 是否打开单点注销功能 is-slo: true - # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) ------- + # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) # 是否打开模式三 isHttp: true # 接口调用秘钥(用于SSO模式三的单点注销功能) diff --git a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml index 3a07ff28..f01c205d 100644 --- a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 9001 -# sa-token配置 +# Sa-Token 配置 sa-token: # SSO-相关配置 sso: @@ -11,7 +11,7 @@ sa-token: # SSO-Server端-单点注销地址 slo-url: http://sso.stp.com:9000/sso/logout - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) alone-redis: # Redis数据库索引 database: 1 diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index e9fff683..32e5c236 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -185,7 +185,13 @@ - + + + + + + + diff --git a/sa-token-doc/fun/curr-domain.md b/sa-token-doc/fun/curr-domain.md index f7d9382b..1a7c2184 100644 --- a/sa-token-doc/fun/curr-domain.md +++ b/sa-token-doc/fun/curr-domain.md @@ -64,10 +64,19 @@ public class CustomSaTokenContextForSpring extends SaTokenContextForSpring { ### 方案二:直接在yml中配置当前项目的网络访问地址 在 `application.yml` 中增加配置: -``` yml + + + +``` yaml sa-token: # 配置当前项目的网络访问地址 curr-domain: http://local.dev33.cn:8902/api ``` + +``` properties +# 配置当前项目的网络访问地址 +sa-token.curr-domain=http://local.dev33.cn:8902/api +``` + 即可避免路由转发过程中丢失 uri 的问题 diff --git a/sa-token-doc/fun/plugin-dev.md b/sa-token-doc/fun/plugin-dev.md index 650b34fa..98a4d54c 100644 --- a/sa-token-doc/fun/plugin-dev.md +++ b/sa-token-doc/fun/plugin-dev.md @@ -96,8 +96,8 @@ SaTokenContext 是对接不同框架的上下文接口,注入流程和第二 | 插件 | 功能 | 状态 | | :-------- | :-------- | :-------- | -| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 | -| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 待开发 | +| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 | +| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 已完成 | | sa-token-hasor-starter | Sa-Token 与 Hasor 的整合 | 待开发 | ##### 标签方言: diff --git a/sa-token-doc/fun/sa-token-context.md b/sa-token-doc/fun/sa-token-context.md index a16f61e4..ae8803aa 100644 --- a/sa-token-doc/fun/sa-token-context.md +++ b/sa-token-doc/fun/sa-token-context.md @@ -71,7 +71,9 @@ public interface SaTokenContext { 先别着急动手,如果你的 Web 框架是基于 Servlet 规范开发的,那么 Sa-Token 已经为你封装好了三个 Model 接口的实现,你要做的就是引入 `sa-token-servlet`包即可: -``` xml + + +``` xml cn.dev33 @@ -79,6 +81,13 @@ public interface SaTokenContext { ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(ServletAPI 集成包) +implementation 'cn.dev33:sa-token-servlet:${sa.top.version}' +``` + + 如果你的 Web 框架不是基于 Servlet 规范,那么你就需要手动实现这三个 Model 接口,我们可以参考 `sa-token-servlet` 是怎样实现的: [SaRequestForServlet.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java)、 diff --git a/sa-token-doc/fun/token-timeout.md b/sa-token-doc/fun/token-timeout.md index 2cef7d86..9faa9cb2 100644 --- a/sa-token-doc/fun/token-timeout.md +++ b/sa-token-doc/fun/token-timeout.md @@ -4,13 +4,24 @@ Sa-Token 提供两种Token自动过期策略,分别是`timeout`与`activity-timeout`,配置方法如下: -``` yml + + +``` yaml sa-token: # Token 有效期,单位:秒,默认30天, -1代表永不过期 timeout: 2592000 # Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 activity-timeout: -1 ``` + +``` properties +# Token 有效期,单位:秒,默认30天, -1代表永不过期 +sa-token.timeout=2592000 +# Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 +sa-token.activity-timeout=-1 +``` + + 两者的区别,可以通过下面的例子体现: diff --git a/sa-token-doc/micro/dcs-session.md b/sa-token-doc/micro/dcs-session.md index 5851bfce..8dfe5a38 100644 --- a/sa-token-doc/micro/dcs-session.md +++ b/sa-token-doc/micro/dcs-session.md @@ -34,18 +34,27 @@ 集成依赖示例: -``` xml - + + +``` xml + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + 详细参考:[集成 Redis](/up/integ-redis) diff --git a/sa-token-doc/micro/gateway-auth.md b/sa-token-doc/micro/gateway-auth.md index 20689f74..fc2308db 100644 --- a/sa-token-doc/micro/gateway-auth.md +++ b/sa-token-doc/micro/gateway-auth.md @@ -14,24 +14,39 @@ 首先,根据 [依赖引入说明](/micro/import-intro) 引入正确的依赖,以`[SpringCloud Gateway]`为例: -``` xml + + +``` xml cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + + + 注:Redis包是必须的,因为我们需要和各个服务通过Redis来同步数据 ### 2、实现鉴权接口 @@ -78,7 +93,7 @@ public class SaTokenConfigure { public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 拦截地址 - .addInclude("/**") + .addInclude("/**") /* 拦截全部path */ // 开放地址 .addExclude("/favicon.ico") // 鉴权方法:每次访问进入 @@ -92,7 +107,7 @@ public class SaTokenConfigure { SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods")); SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders")); - // ... + // 更多匹配 ... */ }) // 异常处理方法:每次setAuth函数出现异常时进入 .setError(e -> { diff --git a/sa-token-doc/micro/id-token.md b/sa-token-doc/micro/id-token.md index a55f9437..95c0c098 100644 --- a/sa-token-doc/micro/id-token.md +++ b/sa-token-doc/micro/id-token.md @@ -23,44 +23,70 @@ Sa-Token提供两种解决方案: ##### 1、引入依赖 在网关处引入的依赖为(此处以 SpringCloud Gateway 为例): -``` xml + + +``` xml cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + 在子服务引入的依赖为: -``` xml + + +``` xml cn.dev33 sa-token-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + ##### 2、网关处添加Id-Token diff --git a/sa-token-doc/micro/import-intro.md b/sa-token-doc/micro/import-intro.md index 8dccf4cd..3de0327c 100644 --- a/sa-token-doc/micro/import-intro.md +++ b/sa-token-doc/micro/import-intro.md @@ -7,25 +7,41 @@ > **在微服务架构中使用Sa-Token时,网关和内部服务要分开引入Sa-Token依赖(不要直接在顶级父pom中引入Sa-Token)** -总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`, +总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`: -``` xml - + + +``` xml + - cn.dev33 - sa-token-spring-boot-starter - ${sa.top.version} + cn.dev33 + sa-token-spring-boot-starter + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' +``` + -``` xml - + + +``` xml + - cn.dev33 - sa-token-reactor-spring-boot-starter - ${sa.top.version} + cn.dev33 + sa-token-reactor-spring-boot-starter + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' +``` + 至于怎么分辨我们需要引入哪个呢?这个要看你使用的基础框架: @@ -40,18 +56,29 @@ 注:切不可直接在一个项目里同时引入这两个依赖,否则会造成项目无法启动 另外,我们需要引入Redis集成包,因为我们的网关和子服务主要通过Redis来同步数据 -``` xml - + + + +``` xml + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + + 详细参考:[集成 Redis](/up/integ-redis) diff --git a/sa-token-doc/oauth2/oauth2-server.md b/sa-token-doc/oauth2/oauth2-server.md index a1e191b2..e4fc2e88 100644 --- a/sa-token-doc/oauth2/oauth2-server.md +++ b/sa-token-doc/oauth2/oauth2-server.md @@ -13,6 +13,8 @@ ### 2、引入依赖 创建SpringBoot项目 `sa-token-demo-oauth2-server`(不会的同学自行百度或参考仓库示例),添加pom依赖: + + ``` xml @@ -28,6 +30,17 @@ ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token-OAuth2.0 模块 +implementation 'cn.dev33:sa-token-oauth2:${sa.top.version}' +``` + + + ### 3、开放服务 1、新建 `SaOAuth2TemplateImpl` diff --git a/sa-token-doc/plugin/alone-redis.md b/sa-token-doc/plugin/alone-redis.md index 8e481df0..4a70d1b9 100644 --- a/sa-token-doc/plugin/alone-redis.md +++ b/sa-token-doc/plugin/alone-redis.md @@ -16,7 +16,9 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起 ### 1、首先引入Alone-Redis依赖 -``` xml + + +``` xml cn.dev33 @@ -24,11 +26,21 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + ### 2、然后在application.yml中增加配置 -``` yml -# Sa-Token配置 + + + + +``` yaml +# Sa-Token 配置 sa-token: # Token名称 token-name: satoken @@ -65,6 +77,45 @@ spring: timeout: 10s ``` + +``` properties +############## Sa-Token 配置 ############## +# Token名称 +sa-token.token-name=satoken +# Token有效期 +sa-token.timeout=2592000 +# Token风格 +sa-token.token-style=uuid + +############## 配置 Sa-Token 单独使用的 Redis 连接 ############## +# Redis数据库索引(默认为0) +sa-token.alone-redis.database=2 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s + +############## 配置业务使用的 Redis 连接 ############## +# Redis数据库索引(默认为0) +spring.redis.database=0 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +# 连接超时时间 +spring.redis.timeout=10s + +``` + + + + 具体可参考示例:[码云:application.yml](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-alone-redis/src/main/resources/application.yml) diff --git a/sa-token-doc/plugin/aop-at.md b/sa-token-doc/plugin/aop-at.md index 26b2339c..c96a1206 100644 --- a/sa-token-doc/plugin/aop-at.md +++ b/sa-token-doc/plugin/aop-at.md @@ -6,14 +6,22 @@ 因此Sa-Token提供AOP插件,你只需在`pom.xml`里添加如下依赖,便可以在任意层级使用注解鉴权 + + ``` xml - + cn.dev33 sa-token-spring-aop ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 SpringAOP 实现注解鉴权 +implementation 'cn.dev33:sa-token-spring-aop:${sa.top.version}' +``` + #### 注意点: diff --git a/sa-token-doc/plugin/dubbo-extend.md b/sa-token-doc/plugin/dubbo-extend.md index 21a0cfa5..b67251fc 100644 --- a/sa-token-doc/plugin/dubbo-extend.md +++ b/sa-token-doc/plugin/dubbo-extend.md @@ -25,7 +25,9 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 在项目已经引入 Dubbo 的基础上,继续添加依赖(Consumer 端和 Provider 端都需要引入): -``` xml + + +``` xml cn.dev33 @@ -33,6 +35,13 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Dubbo +implementation 'cn.dev33:sa-token-context-dubbo:${sa.top.version}' +``` + + 然后我们就可以愉快的做到以下事情: @@ -64,11 +73,19 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 直接在 `application.yml` 配置即可: -``` yml + + +``` yaml sa-token: # 打开 RPC 调用鉴权 check-id-token: true ``` + +``` properties +# 打开 RPC 调用鉴权 +sa-token.check-id-token=true +``` + ##### 方式二、自建 Dubbo 过滤器校验 diff --git a/sa-token-doc/plugin/grpc-extend.md b/sa-token-doc/plugin/grpc-extend.md index 8e3d0e96..84d73506 100644 --- a/sa-token-doc/plugin/grpc-extend.md +++ b/sa-token-doc/plugin/grpc-extend.md @@ -19,7 +19,9 @@ ### 引入插件 需要springboot环境,添加依赖(调用端和被调用端都需要引入): -``` xml + + +``` xml cn.dev33 @@ -27,13 +29,28 @@ ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 grpc +implementation 'cn.dev33:sa-token-context-grpc:${sa.top.version}' +``` + + --- ### 开启id-token校验: 直接在 `application.yml` 配置即可: -``` yml + + +``` yaml sa-token: # 打开 RPC 调用鉴权 check-id-token: true -``` \ No newline at end of file +``` + +``` properties +# 打开 RPC 调用鉴权 +sa-token.check-id-token=true +``` + \ No newline at end of file diff --git a/sa-token-doc/plugin/jwt-extend.md b/sa-token-doc/plugin/jwt-extend.md index acc0b114..3b01727d 100644 --- a/sa-token-doc/plugin/jwt-extend.md +++ b/sa-token-doc/plugin/jwt-extend.md @@ -7,7 +7,9 @@ ### 1、引入依赖 首先在项目已经引入 Sa-Token 的基础上,继续添加: -``` xml + + +``` xml cn.dev33 @@ -15,15 +17,33 @@ ${sa.top.version} ``` -> 注意: sa-token-jwt 显式依赖 hutool-all 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本 + +``` gradle +// Sa-Token 整合 jwt +implementation 'cn.dev33:sa-token-jwt:${sa.top.version}' +``` + + + +> 注意: sa-token-jwt 显式依赖 hutool-jwt 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本 ### 2、配置秘钥 在 `application.yml` 配置文件中配置 jwt 生成秘钥: -``` yml + + + +``` yaml sa-token: # jwt秘钥 jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk ``` + +``` properties +# jwt秘钥 +sa-token.jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk +``` + + 注:为了安全起见请不要直接复制官网示例这个字符串(随便按几个字符就好了) diff --git a/sa-token-doc/plugin/quick-login.md b/sa-token-doc/plugin/quick-login.md index 0997e814..a2a937ce 100644 --- a/sa-token-doc/plugin/quick-login.md +++ b/sa-token-doc/plugin/quick-login.md @@ -44,6 +44,9 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录 首先我们需要创建一个SpringBoot的demo项目,比如:`sa-token-demo-quick-login` ##### 1、添加pom依赖 + + + ``` xml @@ -52,6 +55,14 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录 ${sa.top.version} ``` + +``` gradle +// Sa-Token-Quick-Login 插件 +implementation 'cn.dev33:sa-token-quick-login:${sa.top.version}' +``` + + + ##### 2、启动类 ``` java @@ -98,7 +109,11 @@ public class TestController { ### 可配置信息 你可以在yml中添加如下配置 (所有配置都是可选的) -``` java + + + + +``` yaml # Sa-Token-Quick-Login 配置 sa: # 登录账号 @@ -116,9 +131,33 @@ sa: # 指定拦截路径 # include: /** # 指定排除路径 - # exclude: /sss,/fff + # exclude: /1.jpg ``` + +``` properties +####### Sa-Token-Quick-Login 配置 ####### +# 登录账号 +sa.name=sa +# 登录密码 +sa.pwd=123456 +# 是否自动随机生成账号密码 (此项为true时, name与pwd失效) +sa.auto=false +# 是否开启全局认证(关闭后将不再强行拦截) +sa.auth=true +# 登录页标题 +sa.title=Sa-Token 登录 +# 是否显示底部版权信息 +sa.copr=true +# 指定拦截路径 +# sa.include=/** +# 指定排除路径 +# sa.exclude=/1.jpg +``` + + + +
**注:**示例源码在`/sa-token-demo/sa-token-demo-quick-login`目录下,可结合源码查看学习 diff --git a/sa-token-doc/plugin/temp-token.md b/sa-token-doc/plugin/temp-token.md index dd44ba22..13921c97 100644 --- a/sa-token-doc/plugin/temp-token.md +++ b/sa-token-doc/plugin/temp-token.md @@ -59,6 +59,8 @@ SaTempUtil.deleteToken(token); **[sa-token-temp]** 模块允许以JWT作为逻辑内核完成工作,你只需要引入以下依赖,所有上层API保持不变 + + ``` xml cn.dev33 @@ -66,6 +68,12 @@ SaTempUtil.deleteToken(token); ${sa.top.version} ``` + +``` gradle +implementation 'cn.dev33:sa-token-temp-jwt:${sa.top.version}' +``` + + 并在配置文件中配置上jwt秘钥 **`(必填!)`** ``` java diff --git a/sa-token-doc/plugin/thymeleaf-extend.md b/sa-token-doc/plugin/thymeleaf-extend.md index e33a7dd4..ae8f00fd 100644 --- a/sa-token-doc/plugin/thymeleaf-extend.md +++ b/sa-token-doc/plugin/thymeleaf-extend.md @@ -7,7 +7,9 @@ ### 1、引入依赖 首先我们确保项目已经引入 Thymeleaf 依赖,然后在此基础上继续添加: -``` xml + + +``` xml cn.dev33 @@ -15,6 +17,13 @@ ${sa.top.version} ``` + +``` gradle +// 在 thymeleaf 标签中使用 Sa-Token +implementation 'cn.dev33:sa-token-dialect-thymeleaf:${sa.top.version}' +``` + + ### 2、注册标签方言对象 diff --git a/sa-token-doc/sso/sso-check-domain.md b/sa-token-doc/sso/sso-check-domain.md index 686c9bc2..96caff48 100644 --- a/sa-token-doc/sso/sso-check-domain.md +++ b/sa-token-doc/sso/sso-check-domain.md @@ -21,7 +21,23 @@ 造成此漏洞的直接原因就是SSO-Server认证中心没有对 `redirect地址` 进行任何的限制,防范的方法也很简单,就是对`redirect参数`进行校验,如果其不在指定的URL列表中时,拒绝下放ticket -我们将其配置为一个具体的URL:`allow-url=http://sa-sso-client1.com:9001/sso/login`,再次访问上述连接: +我们将其配置为一个具体的URL: + + +``` yaml +sa-token: + sso: + # 配置允许单点登录的 url + allow-url: http://sa-sso-client1.com:9001/sso/login +``` + +``` properties +# 配置允许单点登录的 url +sa-token.sso.allow-url=http://sa-sso-client1.com:9001/sso/login +``` + + +再次访问上述链接: ![sso-feifa-rf](https://oss.dev33.cn/sa-token/doc/sso/sso-feifa-rf.png 's-w-sh') diff --git a/sa-token-doc/sso/sso-h5.md b/sa-token-doc/sso/sso-h5.md index 4b2ca2ee..e779ab7e 100644 --- a/sa-token-doc/sso/sso-h5.md +++ b/sa-token-doc/sso/sso-h5.md @@ -118,12 +118,21 @@ public class H5Controller { 复制上述地址,将其配置到 Client 端的 yml 配置文件中,例如: -``` yml -sa-token: - sso: + + +``` yaml +sa-token: + sso: # SSO-Server端 统一认证地址 auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html ``` + +``` properties +# SSO-Server端 统一认证地址 +sa-token.sso.auth-url=http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html +``` + + 然后我们启动项目 `sa-token-demo-sso-server` 与 `sa-token-demo-sso2-client`,按照之前的测试步骤访问: [http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/),即可以前后端分离模式完成 SSO-Server 端的授权登录。 diff --git a/sa-token-doc/sso/sso-server.md b/sa-token-doc/sso/sso-server.md index b0a91c64..7588c5e9 100644 --- a/sa-token-doc/sso/sso-server.md +++ b/sa-token-doc/sso/sso-server.md @@ -9,8 +9,10 @@ ### 1、添加依赖 创建 SpringBoot 项目 `sa-token-demo-sso-server`,引入依赖: -``` xml - + + +``` xml + cn.dev33 sa-token-spring-boot-starter @@ -48,6 +50,27 @@ 3.1.1 ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// 视图引擎(在前后端不分离模式下提供视图支持) +implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + +// Http请求工具(在模式三的单点注销功能下用到,如不需要可以注释掉) +implementation 'com.ejlchina:okhttps:3.1.1' +``` + + + 除了 `sa-token-spring-boot-starter` 和 `sa-token-sso` 以外,其它包都是可选的: - 在 SSO 模式三时 Redis 相关包是可选的 @@ -133,6 +156,10 @@ public class GlobalExceptionHandler { ### 3、application.yml配置 + + + + ``` yml # 端口 server: @@ -140,9 +167,9 @@ server: # Sa-Token 配置 sa-token: - # -------------- SSO-模式一相关配置 (非模式一不需要配置) + # ------- SSO-模式一相关配置 (非模式一不需要配置) # cookie: - # 配置Cookie作用域 + # 配置 Cookie 作用域 # domain: stp.com # ------- SSO-模式二相关配置 @@ -154,7 +181,7 @@ sa-token: # 是否打开单点注销功能 is-slo: true - # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) ------- + # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) # 是否打开模式三 isHttp: true # 接口调用秘钥(用于SSO模式三的单点注销功能) @@ -173,8 +200,46 @@ spring: # Redis服务器连接密码(默认为空) password: ``` + +``` properties +# 端口 +server.port=9000 -注意点:`allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项) +################## Sa-Token 配置 ################## +# ------- SSO-模式一相关配置 (非模式一不需要配置) +# 配置 Cookie 作用域 +# sa-token.cookie.domain=stp.com + +# ------- SSO-模式二相关配置 +# Ticket有效期 (单位: 秒),默认五分钟 +sa-token.sso.ticket-timeout=300 +# 所有允许的授权回调地址 +sa-token.sso.allow-url=* +# 是否打开单点注销功能 +sa-token.sso.is-slo=true + +# ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) +# 是否打开模式三 +sa-token.sso.isHttp=true +# 接口调用秘钥(用于SSO模式三的单点注销功能) +sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor + +# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明) + +################## Redis配置 (SSO模式一和模式二使用Redis来同步会话) ################## +# Redis数据库索引(默认为0) +spring.redis.database=1 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +``` + + + +注意点:`sa-token.sso.allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项) ### 4、创建启动类 diff --git a/sa-token-doc/sso/sso-type1.md b/sa-token-doc/sso/sso-type1.md index da45b819..441d551f 100644 --- a/sa-token-doc/sso/sso-type1.md +++ b/sa-token-doc/sso/sso-type1.md @@ -41,12 +41,20 @@ OK,所有理论就绪,下面开始实战: ### 3、指定Cookie的作用域 在`sso.stp.com`访问服务器,其Cookie也只能写入到`sso.stp.com`下,为了将Cookie写入到其父级域名`stp.com`下,我们需要更改 SSO-Server 端的 yml 配置: -``` yml -sa-token: - cookie: - # 配置Cookie作用域 - domain: stp.com + + +``` yaml +sa-token: + cookie: + # 配置 Cookie 作用域 + domain: stp.com ``` + +``` properties +# 配置 Cookie 作用域 +sa-token.cookie.domain=stp.com +``` + 这个配置原本是被注释掉的,现在将其打开。另外我们格外需要注意: 在SSO模式一测试完毕之后,一定要将这个配置再次注释掉,因为模式一与模式二三使用不同的授权流程,这行配置会影响到我们模式二和模式三的正常运行。 @@ -62,12 +70,14 @@ sa-token: #### 4.1、引入依赖 新建项目 sa-token-demo-sso1-client,并添加以下依赖: -``` xml + + +``` xml cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa.top.version} @@ -80,7 +90,7 @@ sa-token: cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa.top.version} org.apache.commons @@ -91,9 +101,25 @@ sa-token: cn.dev33 sa-token-alone-redis - ${sa-token-version} + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// Sa-Token插件:权限缓存与业务缓存分离 +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + #### 4.2、新建 Controller 控制器 @@ -130,12 +156,14 @@ public class SsoClientController { #### 4.3、application.yml 配置 -``` yml + + +``` yaml # 端口 server: port: 9001 -# sa-token配置 +# Sa-Token 配置 sa-token: # SSO-相关配置 sso: @@ -144,7 +172,7 @@ sa-token: # SSO-Server端-单点注销地址 slo-url: http://sso.stp.com:9000/sso/logout - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) alone-redis: # Redis数据库索引 database: 1 @@ -157,6 +185,32 @@ sa-token: # 连接超时时间 timeout: 10s ``` + +``` properties +# 端口 +server.port=9001 + +######### Sa-Token 配置 ######### + +# SSO-Server端-单点登录授权地址 +sa-token.sso.auth-url=http://sso.stp.com:9000/sso/auth +# SSO-Server端-单点注销地址 +sa-token.sso.slo-url=http://sso.stp.com:9000/sso/logout + +# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) +# Redis数据库索引 +sa-token.alone-redis.database=1 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s +``` + + #### 4.4、启动类 diff --git a/sa-token-doc/sso/sso-type2.md b/sa-token-doc/sso/sso-type2.md index 32365880..159b9be9 100644 --- a/sa-token-doc/sso/sso-type2.md +++ b/sa-token-doc/sso/sso-type2.md @@ -49,20 +49,29 @@ #### 3.1、去除 SSO-Server 的 Cookie 作用域配置 在SSO模式一章节中我们打开了配置: - -``` yml + + +``` yaml sa-token: - cookie: - # 配置Cookie作用域 - domain: stp.com + cookie: + # 配置 Cookie 作用域 + domain: stp.com ``` + +``` properties +# 配置 Cookie 作用域 +sa-token.cookie.domain=stp.com +``` + -此为模式一专属配置,现在我们将其注释掉,并按照注释提示打开其他相应的注释 +此为模式一专属配置,现在我们将其注释掉 #### 3.2、创建 SSO-Client 端项目 -创建一个 SpringBoot 项目 `sa-token-demo-sso-client`,引入依赖: -``` xml +创建一个 SpringBoot 项目 `sa-token-demo-sso2-client`,引入依赖: + + +``` xml cn.dev33 @@ -94,6 +103,22 @@ sa-token: ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// Sa-Token插件:权限缓存与业务缓存分离 +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + #### 3.3、创建 SSO-Client 端认证接口 @@ -134,31 +159,62 @@ public class SsoClientController { ##### 3.4、配置SSO认证中心地址 你需要在 `application.yml` 配置如下信息: -``` yml + + + +``` yaml # 端口 server: port: 9001 - + # sa-token配置 sa-token: - # SSO-相关配置 - sso: - # SSO-Server端 统一认证地址 - auth-url: http://sa-sso-server.com:9000/sso/auth + # SSO-相关配置 + sso: + # SSO-Server端 统一认证地址 + auth-url: http://sa-sso-server.com:9000/sso/auth # 是否打开单点注销接口 is-slo: true - - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) - alone-redis: - # Redis数据库索引 (默认为0) - database: 1 - # Redis服务器地址 - host: 127.0.0.1 - # Redis服务器连接端口 - port: 6379 - # Redis服务器连接密码(默认为空) - password: + + # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + alone-redis: + # Redis数据库索引 (默认为0) + database: 1 + # Redis服务器地址 + host: 127.0.0.1 + # Redis服务器连接端口 + port: 6379 + # Redis服务器连接密码(默认为空) + password: + # 连接超时时间 + timeout: 10s ``` + +``` properties +# 端口 +server.port=9001 + +######### Sa-Token 配置 ######### +# SSO-Server端 统一认证地址 +sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth +# 是否打开单点注销接口 +sa-token.sso.is-slo=true + +# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) +# Redis数据库索引 +sa-token.alone-redis.database=1 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s +``` + + + 注意点:`sa-token.alone-redis` 的配置需要和SSO-Server端连接同一个Redis(database也要一样) #### 3.5、写启动类 diff --git a/sa-token-doc/sso/sso-type3.md b/sa-token-doc/sso/sso-type3.md index 4ebf827b..cb427b65 100644 --- a/sa-token-doc/sso/sso-type3.md +++ b/sa-token-doc/sso/sso-type3.md @@ -21,6 +21,9 @@ ### 2、在Client 端更改 Ticket 校验方式 #### 2.1、增加 pom.xml 配置 + + + ``` xml @@ -29,6 +32,14 @@ 3.1.1 ``` + +``` gradle +// Http请求工具 +implementation 'com.ejlchina:okhttps:3.1.1' +``` + + + > OkHttps是一个轻量级http请求工具,详情参考:[OkHttps](https://gitee.com/ejlchina-zhxu/okhttps) #### 2.2、配置 http 请求处理器 @@ -48,14 +59,25 @@ private void configSso(SaSsoConfig sso) { ``` #### 2.3、application.yml 新增配置 -``` yml + + + +``` yaml sa-token: - sso: + sso: # 打开模式三(使用Http请求校验ticket) is-http: true - # SSO-Server端 ticket校验地址 - check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket + # SSO-Server端 ticket校验地址 + check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket ``` + +``` properties +# 打开模式三(使用Http请求校验ticket) +sa-token.sso.is-http=true +# SSO-Server端 ticket校验地址 +sa-token.sso.check-ticket-url=http://sa-sso-server.com:9000/sso/checkTicket +``` + #### 2.4、启动项目测试 重启项目,访问测试:[http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/) @@ -87,13 +109,23 @@ public Object userinfo(String loginId) { ``` #### 3.2、在 Client 端调用此接口查询 userinfo -首先在yml中配置接口地址 -``` yml +首先在 application.yml 中配置接口地址: + + +``` yaml sa-token: sso: # SSO-Server端 查询userinfo地址 userinfo-url: http://sa-sso-server.com:9000/sso/userinfo ``` + +``` properties +# SSO-Server端 查询userinfo地址 +sa-token.sso.userinfo-url=http://sa-sso-server.com:9000/sso/userinfo +``` + + + 然后在`SsoClientController`中新增接口 ``` java @@ -181,7 +213,10 @@ public Object myFollowList() { #### 5.1、SSO-Client 端新增配置 在 `application.yml` 增加配置:`API调用秘钥` 和 `单点注销接口URL`。 -``` yml + + + +``` yaml sa-token: sso: # 打开单点注销功能 @@ -191,6 +226,18 @@ sa-token: # 接口调用秘钥 secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor ``` + +``` properties +# 打开单点注销功能 +sa-token.sso.is-slo=true +# 单点注销地址 +sa-token.sso.slo-url=http://sa-sso-server.com:9000/sso/logout +# 接口调用秘钥 +sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor +``` + + + 注意 secretkey 秘钥需要与SSO认证中心的一致 diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md index f885be05..045efb0a 100644 --- a/sa-token-doc/start/download.md +++ b/sa-token-doc/start/download.md @@ -105,42 +105,42 @@ ## Gradle依赖 -``` xml +``` gradle implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-solon-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-jfinal-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-jboot-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'io.quarkiverse.satoken:quarkus-satoken-resteasy:1.30.0' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-servlet:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-core:${sa.top.version}' ``` diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index d2f9830f..0059f1b0 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -11,16 +11,26 @@ ### 2、添加依赖 -在 `pom.xml` 中添加依赖: +在项目中添加依赖: + + ``` xml - + cn.dev33 sa-token-spring-boot-starter ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' +``` + + + 更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) @@ -28,10 +38,10 @@ Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev3 ### 3、设置配置文件 你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架: - + -``` java +``` yaml server: # 端口 port: 8081 @@ -55,7 +65,7 @@ sa-token: ``` -``` java +``` properties server: # 端口 port: 8081 @@ -78,7 +88,7 @@ sa-token.token-style=uuid sa-token.is-log=false ``` - + ### 4、创建启动类 diff --git a/sa-token-doc/start/webflux-example.md b/sa-token-doc/start/webflux-example.md index 7ac19e56..0c46033a 100644 --- a/sa-token-doc/start/webflux-example.md +++ b/sa-token-doc/start/webflux-example.md @@ -14,16 +14,26 @@ ### 2、添加依赖 -在 `pom.xml` 中添加依赖: +在项目中添加依赖: + + ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' +``` + + + ### 3、创建启动类 @@ -54,7 +64,7 @@ public class SaTokenConfigure { public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 指定 [拦截路由] - .addInclude("/**") + .addInclude("/**") /* 拦截所有path */ // 指定 [放行路由] .addExclude("/favicon.ico") // 指定[认证函数]: 每次请求执行 diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css index 4da3b9d1..2ec73991 100644 --- a/sa-token-doc/static/doc.css +++ b/sa-token-doc/static/doc.css @@ -106,7 +106,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .code-line-box {line-height: inherit !important; background-color: #191919; color: #aaa;font-weight: 400;font-size: 0.85em;text-align: center;} /* xml语言样式优化 */ -.lang-xml .token.comment{color: #CDAB53;} +/* .lang-xml .token.comment{color: #CDAB53;} */ .lang-xml .token.tag *{color: #db2d20;} .lang-xml .token.attr-value{color: #A6E22E;} @@ -123,24 +123,23 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .lang-java .token.keyword{color: #db2d20;} .lang-java .token.namespace,.lang-java .token.namespace *{color: #01A252; opacity: 1;} .lang-java .token.class-name,.lang-java .cm-variable{color: #55b5db; opacity: 1;} -.lang-java .token.comment{color: #CDAB53;} +/* .lang-java .token.comment{color: #CDAB53;} */ .lang-java .token.annotation.punctuation{color: #ddd;} .lang-java .token.punctuation{color: #ddd;} -/* yml语言样式优化 */ -.main-box .lang-yml{color: #01A252 !important; opacity: 1;} +/* cmd语言样式优化 */ +.main-box .lang-cmd{color: #01A252 !important; opacity: 1;} -/* yml语言样式优化 */ +/* url语言样式优化 */ .main-box .lang-url{color: #E96917 !important; opacity: 1;} /* js语言样式优化 */ .main-box .lang-js{color: #01a252 !important;} -.lang-js .token.comment{color: #CDAB53;} +/* .lang-js .token.comment{color: #CDAB53;} */ /* .lang-js .token.string{color: #fded02;} */ .lang-js .token.string{color: #ddd;} .lang-js .token.punctuation{color: #ddd;} -/* .gt-container{padding: 1.5em; padding-bottom: 100px;} */ /* ------- markdown 内容样式优化 ------- */ @@ -162,8 +161,14 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .gzh-table td b{display: block; margin-bottom: 10px; } /* tab选项卡优化 */ +/* .docsify-tabs--classic{background-color: rgba(255, 255, 255, 0.2);} */ .docsify-tabs__tab{outline: 0; cursor: pointer;} .docsify-tabs--classic .docsify-tabs__tab--active{box-shadow: 0 0 0;} +/* tab卡片插件样式优化 */ +.main-box{ + --docsifytabs-border-color: #ddd; + --docsifytabs-tab-color: #777; +} /* 调整表格的响应式 */ @@ -209,6 +214,7 @@ body { #main .toc-box a{border-color: rgba(0,0,0,0); transition: 0s;} #main .toc-box a span{color: inherit;} + /* 加载图片的按钮 */ .show-img{ background-color: #FFF; diff --git a/sa-token-doc/static/prism/prism-gradle.min.js b/sa-token-doc/static/prism/prism-gradle.min.js new file mode 100644 index 00000000..96aae9aa --- /dev/null +++ b/sa-token-doc/static/prism/prism-gradle.min.js @@ -0,0 +1 @@ +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism); \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-java.min.js b/sa-token-doc/static/prism/prism-java.min.js new file mode 100644 index 00000000..9b90cf3c --- /dev/null +++ b/sa-token-doc/static/prism/prism-java.min.js @@ -0,0 +1 @@ +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-properties.min.js b/sa-token-doc/static/prism/prism-properties.min.js new file mode 100644 index 00000000..5976d476 --- /dev/null +++ b/sa-token-doc/static/prism/prism-properties.min.js @@ -0,0 +1 @@ +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-yaml.min.js b/sa-token-doc/static/prism/prism-yaml.min.js new file mode 100644 index 00000000..5cd16d3d --- /dev/null +++ b/sa-token-doc/static/prism/prism-yaml.min.js @@ -0,0 +1 @@ +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file diff --git a/sa-token-doc/up/global-filter.md b/sa-token-doc/up/global-filter.md index 816892f4..d305f2bf 100644 --- a/sa-token-doc/up/global-filter.md +++ b/sa-token-doc/up/global-filter.md @@ -23,7 +23,6 @@ Sa-Token同时提供过滤器和拦截器机制,不是为了让谁替代谁, ``` java /** * [Sa-Token 权限认证] 配置类 - * @author kong */ @Configuration public class SaTokenConfigure { @@ -36,7 +35,7 @@ public class SaTokenConfigure { return new SaServletFilter() // 指定 拦截路由 与 放行路由 - .addInclude("/**").addExclude("/favicon.ico") + .addInclude("/**").addExclude("/favicon.ico") /* 排除掉 /favicon.ico */ // 认证函数: 每次请求执行 .setAuth(obj -> { @@ -45,7 +44,7 @@ public class SaTokenConfigure { // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录 SaRouter.match("/**", "/user/doLogin", () -> StpUtil.checkLogin()); - // 更多拦截处理方式,请参考“路由拦截式鉴权”章节 + // 更多拦截处理方式,请参考“路由拦截式鉴权”章节 */ }) // 异常处理函数:每次认证函数发生异常时执行此函数 @@ -97,7 +96,6 @@ JSON 工具类可参考:[Hutool-Json](https://hutool.cn/docs/#/json/JSONUtil) ``` java /** * [Sa-Token 权限认证] 配置类 - * @author kong */ @Configuration public class SaTokenConfigure { diff --git a/sa-token-doc/up/integ-redis.md b/sa-token-doc/up/integ-redis.md index ae942232..43d66bb8 100644 --- a/sa-token-doc/up/integ-redis.md +++ b/sa-token-doc/up/integ-redis.md @@ -14,6 +14,9 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 --- ### 方式1、Sa-Token 整合 Redis (使用 jdk 默认序列化方式) + + + ``` xml @@ -22,10 +25,20 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jdk 默认序列化方式) +implementation 'cn.dev33:sa-token-dao-redis:${sa.top.version}' +``` + + 优点:兼容性好,缺点:Session 序列化后基本不可读,对开发者来讲等同于乱码。 ### 方式2、Sa-Token 整合 Redis(使用 jackson 序列化方式) + + + ``` xml @@ -34,6 +47,13 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +``` + + 优点:Session 序列化后可读性强,可灵活手动修改,缺点:兼容性稍差。 @@ -41,18 +61,30 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 **1. 无论使用哪种序列化方式,你都必须为项目提供一个 Redis 实例化方案,例如:** -``` xml + + + +``` xml org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'org.apache.commons:commons-pool2' +``` + + **2. 引入了依赖,我还需要为 Redis 配置连接信息吗?**
需要!只有项目初始化了正确的 Redis 实例,`Sa-Token`才可以使用 Redis 进行数据持久化,参考以下`yml配置`: -``` java -# 端口 + + + +``` yaml spring: # redis配置 redis: @@ -77,6 +109,30 @@ spring: # 连接池中的最小空闲连接 min-idle: 0 ``` + +``` properties +# Redis数据库索引(默认为0) +spring.redis.database=1 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +# spring.redis.password= +# 连接超时时间 +spring.redis.timeout=10s +# 连接池最大连接数 +spring.redis.lettuce.pool.max-active=200 +# 连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.lettuce.pool.max-wait=-1ms +# 连接池中的最大空闲连接 +spring.redis.lettuce.pool.max-idle=10 +# 连接池中的最小空闲连接 +spring.redis.lettuce.pool.min-idle=0 +``` + + + **3. 集成 Redis 后,是我额外手动保存数据,还是框架自动保存?**
diff --git a/sa-token-doc/up/token-prefix.md b/sa-token-doc/up/token-prefix.md index 7d88a46c..390e4f54 100644 --- a/sa-token-doc/up/token-prefix.md +++ b/sa-token-doc/up/token-prefix.md @@ -13,11 +13,21 @@ 此时后端如果不做任何特殊处理,框架将会把`Bearer `视为token的一部分,无法正常读取token信息,导致鉴权失败。 为此,我们需要在yml中添加如下配置: -``` java + + + +``` yaml sa-token: # token前缀 token-prefix: Bearer ``` + +``` properties +# token前缀 +sa-token.token-prefix: Bearer +``` + + 此时 Sa-Token 便可在读取 Token 时裁剪掉 `Bearer`,成功获取`xxxx-xxxx-xxxx-xxxx`。 diff --git a/sa-token-doc/up/token-style.md b/sa-token-doc/up/token-style.md index 8cbc31da..78f9620a 100644 --- a/sa-token-doc/up/token-style.md +++ b/sa-token-doc/up/token-style.md @@ -59,7 +59,7 @@ public class SaTokenConfigure { ``` 2、再次调用 `StpUtil.login(10001)`方法进行登录,观察其生成的token样式: -``` html +``` java gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH ``` diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index d5455054..40db73b8 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -6,10 +6,10 @@ ### 方式1、在 application.yml 配置 - + - -``` java + +``` yaml ############## Sa-Token 配置 ############## ############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## sa-token: @@ -29,8 +29,8 @@ sa-token: is-log: false ``` - -``` java + +``` properties ############## Sa-Token 配置 ############## ############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## @@ -50,7 +50,7 @@ sa-token.token-style=uuid sa-token.is-log=false ``` - + @@ -181,7 +181,10 @@ Client 端: 配置示例: -``` yml + + + +``` yaml # Sa-Token 配置 sa-token: # SSO-相关配置 @@ -189,6 +192,13 @@ sa-token: # SSO-Server端 单点登录授权地址 auth-url: http://sa-sso-server.com:9000/sso/auth ``` + +``` properties +# SSO-Server端 单点登录授权地址 +sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth +``` + + @@ -207,7 +217,9 @@ sa-token: | pastClientTokenTimeout | long | 7200 | `Past-Client-Token` 保存的时间(单位:秒) ,默认为-1,代表延续 `Client-Token` 的有效时间 | 配置示例: -``` yml + + +``` yaml # Sa-Token 配置 sa-token: token-name: satoken-server @@ -218,6 +230,18 @@ sa-token: is-password: true is-client: true ``` + +``` properties +# Sa-Token 配置 +sa-token.token-name=satoken-server +# OAuth2.0 配置 +sa-token.oauth2.is-code=true +sa-token.oauth2.is-implicit=true +sa-token.oauth2.is-password=true +sa-token.oauth2.is-client=true +``` + + ##### SaClientModel属性定义 | 参数名称 | 类型 | 默认值 | 说明 | @@ -300,30 +324,24 @@ sa-token: 在开发 SSO 模块时,我们需要在 sso-client 配置认证中心的各种地址,特别是在模式三下,一般代码会变成这样: -``` java +``` yaml sa-token: sso: # SSO-Server端 统一认证地址 auth-url: http://sa-sso-server.com:9000/sso/auth - # 使用Http请求校验ticket - is-http: true # SSO-Server端 ticket校验地址 check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket # 单点注销地址 slo-url: http://sa-sso-server.com:9000/sso/logout - # 接口调用秘钥 - secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor # SSO-Server端 查询userinfo地址 userinfo-url: http://sa-sso-server.com:9000/sso/userinfo ``` 一堆 xxx-url 配置比较繁琐,且含有大量重复字符,现在我们可以将其简化为: -``` java +``` yaml sa-token: sso: server-url: http://sa-sso-server.com:9000 - is-http: true - secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor ``` 只要你配置了 `server-url` 地址,Sa-Token 就可以自动拼接出其它四个地址: diff --git a/sa-token-doc/use/route-check.md b/sa-token-doc/use/route-check.md index f515f7d6..2ce32104 100644 --- a/sa-token-doc/use/route-check.md +++ b/sa-token-doc/use/route-check.md @@ -44,7 +44,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { registry.addInterceptor(new SaInterceptor(handler -> { // 指定一条 match 规则 SaRouter - .match("/**") // 拦截的 path 列表,可以写多个 + .match("/**") // 拦截的 path 列表,可以写多个 */ .notMatch("/user/doLogin") // 排除掉的 path 列表,可以写多个 .check(r -> StpUtil.checkLogin()); // 要执行的校验动作,可以写完整的 lambda 表达式