From d313d00b05ec1dbce6bcc4ec8b060740f006d3f2 Mon Sep 17 00:00:00 2001 From: noear Date: Mon, 13 Mar 2023 18:00:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20sa-token-demo-sso2-client-?= =?UTF-8?q?solon=20=E7=A4=BA=E4=BE=8B=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sa-token-demo-sso2-client-solon/pom.xml | 53 ++++++++++++++++++ .../src/main/java/com/pj/SaConfig.java | 22 ++++++++ .../src/main/java/com/pj/SaSso2ClientApp.java | 15 +++++ .../src/main/java/com/pj/h5/CorsFilter.java | 38 +++++++++++++ .../src/main/java/com/pj/h5/H5Controller.java | 55 +++++++++++++++++++ .../java/com/pj/sso/SsoClientController.java | 49 +++++++++++++++++ .../src/main/resources/app.yml | 26 +++++++++ 7 files changed, 258 insertions(+) create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/pom.xml create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaConfig.java create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaSso2ClientApp.java create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/CorsFilter.java create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/H5Controller.java create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/sso/SsoClientController.java create mode 100644 sa-token-demo/sa-token-demo-sso2-client-solon/src/main/resources/app.yml diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/pom.xml b/sa-token-demo/sa-token-demo-sso2-client-solon/pom.xml new file mode 100644 index 00000000..009a64c6 --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + cn.dev33 + sa-token-demo-sso2-client-solon + 0.0.1-SNAPSHOT + + + + org.noear + solon-parent + 2.2.3 + + + + + + 1.34.0 + + + + + + + org.noear + solon-api + + + + + cn.dev33 + sa-token-solon-plugin + ${sa-token.version} + + + + + cn.dev33 + sa-token-sso + ${sa-token.version} + + + + + cn.dev33 + sa-token-dao-redisx + ${sa-token.version} + + + + + \ No newline at end of file diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaConfig.java b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaConfig.java new file mode 100644 index 00000000..6b7d743e --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaConfig.java @@ -0,0 +1,22 @@ +package com.pj; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.solon.dao.SaTokenDaoOfRedis; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; + +/** + * @author noear 2023/3/13 created + */ +@Configuration +public class SaConfig { + + /** + * 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + * */ + @Bean + public SaTokenDao saTokenDaoInit(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) { + return saTokenDao; + } +} diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaSso2ClientApp.java b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaSso2ClientApp.java new file mode 100644 index 00000000..8e04700f --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/SaSso2ClientApp.java @@ -0,0 +1,15 @@ +package com.pj; + + +import org.noear.solon.Solon; +import org.noear.solon.annotation.SolonMain; + +@SolonMain +public class SaSso2ClientApp { + + public static void main(String[] args) { + Solon.start(SaSso2ClientApp.class, args); + System.out.println("\nSa-Token SSO模式二 Client端启动成功"); + } + +} \ No newline at end of file diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/CorsFilter.java b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/CorsFilter.java new file mode 100644 index 00000000..f7a95bc0 --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/CorsFilter.java @@ -0,0 +1,38 @@ +package com.pj.h5; + +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Filter; +import org.noear.solon.core.handle.FilterChain; + + +/** + * 跨域过滤器 + * @author kong + */ +@Component(index = -200) +public class CorsFilter implements Filter { + static final String OPTIONS = "OPTIONS"; + + @Override + public void doFilter(Context ctx, FilterChain chain) throws Throwable { + // 允许指定域访问跨域资源 + ctx.headerSet("Access-Control-Allow-Origin", "*"); + // 允许所有请求方式 + ctx.headerSet("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + // 有效时间 + ctx.headerSet("Access-Control-Max-Age", "3600"); + // 允许的header参数 + ctx.headerSet("Access-Control-Allow-Headers", "x-requested-with,satoken"); + + // 如果是预检请求,直接返回 + if (OPTIONS.equals(ctx.method())) { + System.out.println("=======================浏览器发来了OPTIONS预检请求=========="); + ctx.output(""); + return; + } + + // System.out.println("*********************************过滤器被使用**************************"); + chain.doFilter(ctx); + } +} diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/H5Controller.java b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/H5Controller.java new file mode 100644 index 00000000..efa3d801 --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/h5/H5Controller.java @@ -0,0 +1,55 @@ +package com.pj.h5; + +import cn.dev33.satoken.sso.SaSsoProcessor; +import cn.dev33.satoken.sso.SaSsoUtil; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Render; + +/** + * 前后台分离架构下集成SSO所需的代码 (SSO-Client端) + *

(注:如果不需要前后端分离架构下集成SSO,可删除此包下所有代码)

+ * @author kong + * + */ +@Controller +public class H5Controller implements Render { + + // 当前是否登录 + @Mapping("/sso/isLogin") + public Object isLogin() { + return SaResult.data(StpUtil.isLogin()); + } + + // 返回SSO认证中心登录地址 + @Mapping("/sso/getSsoAuthUrl") + public SaResult getSsoAuthUrl(String clientLoginUrl) { + String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(clientLoginUrl, ""); + return SaResult.data(serverAuthUrl); + } + + // 根据ticket进行登录 + @Mapping("/sso/doLoginByTicket") + public SaResult doLoginByTicket(String ticket) { + Object loginId = SaSsoProcessor.instance.checkTicket(ticket, "/sso/doLoginByTicket"); + if(loginId != null) { + StpUtil.login(loginId); + return SaResult.data(StpUtil.getTokenValue()); + } + return SaResult.error("无效ticket:" + ticket); + } + + // 全局异常拦截并转换 + @Override + public void render(Object data, Context ctx) throws Throwable { + if(data instanceof Exception){ + data = SaResult.error(((Exception)data).getMessage()); + } + + ctx.render(data); + } + +} diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/sso/SsoClientController.java b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/sso/SsoClientController.java new file mode 100644 index 00000000..61762374 --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/java/com/pj/sso/SsoClientController.java @@ -0,0 +1,49 @@ +package com.pj.sso; + + +import cn.dev33.satoken.sso.SaSsoProcessor; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Render; + +/** + * Sa-Token-SSO Client端 Controller + * @author kong + */ +@Controller +public class SsoClientController implements Render { + + // 首页 + @Mapping("/") + public String index() { + String str = "

Sa-Token SSO-Client 应用端

" + + "

当前会话是否登录:" + StpUtil.isLogin() + "

" + + "

登录 " + + "注销

"; + return str; + } + + /* + * SSO-Client端:处理所有SSO相关请求 + * http://{host}:{port}/sso/login -- Client端登录地址,接受参数:back=登录后的跳转地址 + * http://{host}:{port}/sso/logout -- Client端单点注销地址(isSlo=true时打开),接受参数:back=注销后的跳转地址 + * http://{host}:{port}/sso/logoutCall -- Client端单点注销回调地址(isSlo=true时打开),此接口为框架回调,开发者无需关心 + */ + @Mapping("/sso/*") + public Object ssoRequest() { + return SaSsoProcessor.instance.clientDister(); + } + + // 全局异常拦截并转换 + @Override + public void render(Object data, Context ctx) throws Throwable { + if(data instanceof Exception){ + data = SaResult.error(((Exception)data).getMessage()); + } + + ctx.render(data); + } +} diff --git a/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/resources/app.yml b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/resources/app.yml new file mode 100644 index 00000000..4c06a05c --- /dev/null +++ b/sa-token-demo/sa-token-demo-sso2-client-solon/src/main/resources/app.yml @@ -0,0 +1,26 @@ +# 端口 +server: + port: 9001 + +# sa-token配置 +sa-token: + # SSO-相关配置 + sso: + # SSO-Server端 统一认证地址 + auth-url: http://sa-sso-server.com:9000/sso/auth + # auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html + # 是否打开单点注销接口 + is-slo: true + +# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) +sa-token-dao: #名字可以随意取 + redis: + server: "localhost:6379" + password: 123456 + db: 1 + maxTotal: 200 + + + + + \ No newline at end of file