From f0a1c68e2ba453e6f7ba9b8cb657d8815551cf21 Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Mon, 24 Oct 2022 17:29:12 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20SSO=20=E5=B9=B3=E5=8F=B0?=
=?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=A8=A1=E5=BC=8F=E7=A4=BA=E4=BE=8B=EF=BC=8C?=
=?UTF-8?q?=E8=B7=B3=E8=BF=9E=E6=8E=A5=E8=BF=9B=E5=85=A5=E5=AD=90=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/pj/sso/HomeController.java | 43 +++++++++
sa-token-doc/_sidebar.md | 5 +-
sa-token-doc/sso/sso-home-jump.md | 92 +++++++++++++++++++
3 files changed, 138 insertions(+), 2 deletions(-)
create mode 100644 sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java
create mode 100644 sa-token-doc/sso/sso-home-jump.md
diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java b/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java
new file mode 100644
index 00000000..67344088
--- /dev/null
+++ b/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java
@@ -0,0 +1,43 @@
+package com.pj.sso;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.stp.StpUtil;
+
+/**
+ * SSO 平台中心模式示例,跳连接进入子系统
+ *
+ * @author kong
+ * @since 2022-10-24
+ */
+@RestController
+public class HomeController {
+
+ /**
+ * 平台化首页
+ * @return
+ */
+ @RequestMapping("/home")
+ public Object index() {
+ // 如果未登录,则先去登录
+ if(StpUtil.isLogin() == false) {
+ return SaHolder.getResponse().redirect("/sso/auth");
+ }
+
+ // 拼接各个子系统的地址,格式形如:/sso/auth?redirect=${子系统首页}/sso/login?back=${子系统首页}
+ String link1 = "/sso/auth?redirect=http://sa-sso-client1.com:9001/sso/login?back=http://sa-sso-client1.com:9001/";
+ String link2 = "/sso/auth?redirect=http://sa-sso-client2.com:9001/sso/login?back=http://sa-sso-client2.com:9001/";
+ String link3 = "/sso/auth?redirect=http://sa-sso-client3.com:9001/sso/login?back=http://sa-sso-client3.com:9001/";
+
+ // 组织网页结构返回到前端
+ String title = "
SSO 平台首页
";
+ String client1 = " 进入Client1系统
";
+ String client2 = " 进入Client2系统
";
+ String client3 = " 进入Client3系统
";
+
+ return title + client1 + client2 + client3;
+ }
+
+}
diff --git a/sa-token-doc/_sidebar.md b/sa-token-doc/_sidebar.md
index ad64f509..85acb1d6 100644
--- a/sa-token-doc/_sidebar.md
+++ b/sa-token-doc/_sidebar.md
@@ -42,8 +42,9 @@
- [SSO整合:配置域名校验](/sso/sso-check-domain)
- [SSO整合:定制化登录页面](/sso/sso-custom-login)
- [SSO整合:自定义API路由](/sso/sso-custom-api)
- - [SSO整合:前后端分离下的整合方案](/sso/sso-h5)
- - [SSO整合:常见问题总结](/sso/sso-questions)
+ - [SSO扩展:前后端分离下的整合方案](/sso/sso-h5)
+ - [SSO扩展:平台中心跳转模式](/sso/sso-home-jump)
+ - [SSO扩展:常见问题总结](/sso/sso-questions)
- [Sa-Sso-Pro:单点登录商业版](/sso/sso-pro)
- **OAuth2.0**
diff --git a/sa-token-doc/sso/sso-home-jump.md b/sa-token-doc/sso/sso-home-jump.md
new file mode 100644
index 00000000..0db99b3f
--- /dev/null
+++ b/sa-token-doc/sso/sso-home-jump.md
@@ -0,0 +1,92 @@
+# SSO 平台中心跳转模式,点连接跳入子系统
+
+---
+
+有的时候,我们需要把 sso-server 搭建成一个平台中心,效果图大致如下:
+
+
+
+如图所示,用户先从 sso-server 登录进入平台首页,在首页上有各个子系统的进入链接,用户点击链接进入子系统(免登录)。
+
+怎么做到如上效果呢?当然,加个超链接跳到子系统并不难,难点在于跳转的同时我们需要让用户自动登录上子系统,从而达到:平台中心一处登录,所有子系统无障碍通行的效果。
+
+怎么做到跳转的时候自动登录呢?直接跳转肯定是不会自动登录的,我们需要对链接改造一下:
+
+假设子系统的地址是:
+
+``` url
+http://sa-sso-client1.com:9001/
+```
+
+那么我们改造后的地址就是:
+
+``` url
+/sso/auth?redirect=http://sa-sso-client1.com:9001/sso/login?back=http://sa-sso-client1.com:9001/
+```
+
+格式形如:`/sso/auth?redirect=${子系统首页}/sso/login?back=${子系统首页}`
+
+---
+
+### 完整代码示例:
+
+1、在 sso-server 中添加 `HomeController`,作为平台中心首页:
+
+``` java
+/**
+ * SSO 平台中心模式示例,跳连接进入子系统
+ */
+@RestController
+public class HomeController {
+ // 平台化首页
+ @RequestMapping("/home")
+ public Object index() {
+ // 如果未登录,则先去登录
+ if(StpUtil.isLogin()) {
+ return SaHolder.getResponse().redirect("/sso/auth");
+ }
+
+ // 拼接各个子系统的地址,格式形如:/sso/auth?redirect=${子系统首页}/sso/login?back=${子系统首页}
+ String link1 = "/sso/auth?redirect=http://sa-sso-client1.com:9001/sso/login?back=http://sa-sso-client1.com:9001/";
+ String link2 = "/sso/auth?redirect=http://sa-sso-client2.com:9001/sso/login?back=http://sa-sso-client2.com:9001/";
+ String link3 = "/sso/auth?redirect=http://sa-sso-client3.com:9001/sso/login?back=http://sa-sso-client3.com:9001/";
+
+ // 组织网页结构返回到前端
+ String title = "SSO 平台首页
";
+ String client1 = " 进入Client1系统
";
+ String client2 = " 进入Client2系统
";
+ String client3 = " 进入Client3系统
";
+
+ return title + client1 + client2 + client3;
+ }
+}
+```
+
+2、修改一下SSO路由处理的代码,使登录后不再重定向到client端,而是跳转到平台中心首页。
+
+在 `SsoServerController` 的 `ssoRequest` 方法中添加跳转 `/home` 的代码:
+
+``` java
+// SSO-Server端:处理所有SSO相关请求
+@RequestMapping("/sso/*")
+public Object ssoRequest() {
+ // 如果登录时没有提供redirect参数,则进入平台中心首页 /home,而不是重定向到 client 端
+ SaRequest req = SaHolder.getRequest();
+ if(req.isPath("/sso/auth") && req.hasParam("redirect") == false && StpUtil.isLogin()) {
+ return SaHolder.getResponse().redirect("/home");
+ }
+ return SaSsoHandle.serverRequest();
+}
+```
+
+新加代码在 4-8 行。
+
+### 测试访问
+
+启动项目,访问:[http://sa-sso-server.com:9000/home](http://sa-sso-server.com:9000/home)
+
+首次访问,因为我们没有登录,所以会被重定向到 `/sso/auth` 登录页,我们登录上之后,便会跳转到平台中心首页:
+
+
+
+依次点击三个链接,便可在跳转的同时自动登录上子系统。