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-home-jump.png](https://oss.dev33.cn/sa-token/doc/sso/sso-home-jump.png 's-w-sh') + +如图所示,用户先从 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` 登录页,我们登录上之后,便会跳转到平台中心首页: + +![sso-home-jump-do.png](https://oss.dev33.cn/sa-token/doc/sso/sso-home-jump-do.png 's-w-sh') + +依次点击三个链接,便可在跳转的同时自动登录上子系统。