diff --git a/sa-token-doc/doc/index-backup.html b/sa-token-doc/doc/index-backup.html index 5878a537..a5c27047 100644 --- a/sa-token-doc/doc/index-backup.html +++ b/sa-token-doc/doc/index-backup.html @@ -152,7 +152,7 @@ - + diff --git a/sa-token-doc/doc/index.html b/sa-token-doc/doc/index.html index aec8994e..4281a962 100644 --- a/sa-token-doc/doc/index.html +++ b/sa-token-doc/doc/index.html @@ -153,7 +153,7 @@ - + diff --git a/sa-token-doc/doc/lib/prism-java.min.js b/sa-token-doc/doc/lib/prism-java.min.js new file mode 100644 index 00000000..079c8d4e --- /dev/null +++ b/sa-token-doc/doc/lib/prism-java.min.js @@ -0,0 +1 @@ +!function(e){var t=/\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|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); \ No newline at end of file diff --git a/sa-token-doc/doc/sso/sso-type3.md b/sa-token-doc/doc/sso/sso-type3.md index edb70b9d..6fdf31ae 100644 --- a/sa-token-doc/doc/sso/sso-type3.md +++ b/sa-token-doc/doc/sso/sso-type3.md @@ -106,19 +106,60 @@ public Object myinfo() { } ``` +#### 3.3、访问测试 访问测试:[http://sa-sso-client1.com:9001/sso/myinfo](http://sa-sso-client1.com:9001/sso/myinfo) -#### 3.3、疑问 + +### 4、自定义接口通信 群里有小伙伴提问:`SaSsoUtil.getUserinfo` 提供的参数太少,只有一个 loginId,无法满足业务需求怎么办? 答:SaSsoUtil.getUserinfo只是为了避免你在项目中硬编码认证中心 url 而提供的简易封装,如果这个API无法满足你的业务需求, 你完全可以在 Server 端自定义一些接口然后从 Client 端使用 http 工具调用即可。 +以下是一个简单的示例: + +#### 4.1、先在 sso-server 端自定义一个接口 +``` java +// 获取指定用户的关注列表 +@RequestMapping("/sso/getFollowList") +public Object ssoRequest(Long loginId) { + + // 校验签名,签名不通过直接抛出异常 + SaSsoUtil.checkSign(SaHolder.getRequest()); + + // 查询数据 (此处仅做模拟) + List list = Arrays.asList(10041, 10042, 10043, 10044); + + // 返回 + return list; +} +``` + + +#### 4.2、然后在 sso-client 端调用这个接口 +``` java +// 查询我的账号信息 +@RequestMapping("/sso/myFollowList") +public Object myFollowList() { + // 组织url,加上签名参数 + String url = SaSsoUtil.addSignParams("http://sa-sso-server.com:9000/sso/getFollowList", StpUtil.getLoginId()); + + // 调用,并返回 SaResult 结果 + SaResult res = SaSsoUtil.request(url); + + // 返回给前端 + return res; +} +``` + +#### 4.3、访问测试 +访问测试:[http://sa-sso-client1.com:9001/sso/myFollowList](http://sa-sso-client1.com:9001/sso/myFollowList) -### 4、无刷单点注销 + +### 5、无刷单点注销 有了单点登录就必然要有单点注销,网上给出的大多数解决方案是将注销请求重定向至SSO-Server中心,逐个通知Client端下线 @@ -137,7 +178,7 @@ public Object myinfo() { 这些逻辑 Sa-Token 内部已经封装完毕,你只需按照文档增加以下配置即可: -#### 4.1、SSO-Client 端新增配置 +#### 5.1、SSO-Client 端新增配置 在 `application.yml` 增加配置:`API调用秘钥` 和 `单点注销接口URL`。 ``` yml @@ -153,7 +194,7 @@ sa-token: 注意 secretkey 秘钥需要与SSO认证中心的一致 -#### 4.2 启动测试 +#### 5.2、启动测试 重启项目,访问测试:[http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/), 我们主要的测试点在于 `单点注销`,正常登录即可。 @@ -167,16 +208,16 @@ sa-token: PS:这里我们为了方便演示,使用的是超链接跳页面的形式,正式项目中使用 Ajax 调用接口即可做到无刷单点登录退出。 -例如,我们使用 [APIPost接口测试工具](https://www.apipost.cn/) 可以做到同样的效果: +例如,我们使用 [Apifox 接口测试工具](https://www.apifox.cn/) 可以做到同样的效果: -![sso-slo-apipost.png](https://oss.dev33.cn/sa-token/doc/sso/sso-slo-apipost.png 's-w-sh') +![sso-slo-apifox.png](https://oss.dev33.cn/sa-token/doc/sso/sso-slo-apifox.png 's-w-sh') 测试完毕! -### 4、后记 +### 6、后记 当我们熟读三种模式的单点登录之后,其实不难发现:所谓单点登录,其本质就是多个系统之间的会话共享。 当我们理解这一点之后,三种模式的工作原理也浮出水面: