- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
6.4 SSO 客户端
SSO 客户端要使用安全配置模块的功能,需要在工程的 Maven 依赖管理中,增加一个依赖配置,如代码清单 6-5 所示。
代码清单 6-5 引用安全配置模块的依赖配置
<dependency> <groupId>springboot.demo</groupId> <artifactId>security</artifactId> <version>${project.version}</version> </dependency>
6.4.1 客户端配置
当客户端引用安全配置模块之后,就必须在配置文件 application.yml 中进行一些相关的配置,才能正常使用。代码清单 6-6 是一个 SSO 客户端的配置,它包含两方面的内容,其中 security 是 OAuth2 的配置,securityconfig 是 Spring Security 的配置。
在 OAuth2 的配置中,loginPath 是一个登录的链接地址,clientId 和 clientSecret 是由 SSO 认证服务器提供的客户端 ID 和密钥,accessTokenUri 是取得令牌的链接地址,userAuthorizationUri 是用户授权确认的链接地址,keyUri 是当客户端被指定为资源服务器时所用的令牌链接地址。
Spring Security 的配置中是设计的一些自定义配置参数,它将被安全管理策略配置类调用,其中 logoutsuccssurl 是一个登出成功的链接地址,其他配置参数与第 5 章的安全管理配置基本相同。
代码清单 6-6 SSO 客户端配置
security: ignored: /favicon.ico,/scripts/**,/styles/**,/images/** sessions: ALWAYS oauth2: sso: loginPath: /login client: clientId: ssoclient clientSecret: ssosecret accessTokenUri: http://localhost/oauth/token userAuthorizationUri: http://localhost/oauth/authorize clientAuthenticationScheme: form resource: jwt: keyUri: http://localhost/oauth/token_key securityconfig: logoutsuccssurl: /tosignout permitall: /rest/**,/bb** deniedpage: /deny urlroles: /**/new/** = admin; /**/edit/** = admin,editor; /**/delete/** = admin
6.4.2 登录登出设计
登录登出的设计,虽然在 Spring Security 中已经实现,但是对于使用 SSO 的客户端来说,必须进行一些合理的调整,否则如果设计不当,就有可能出现无法正常退出或者登录失败的情况。
代码清单 6-7 是客户端的一个登录控制器设计,它使用一个重定向链接“redirect:/#/”来刷新当前访问页面,从而触发系统检查用户的授权状态,如果用户未被授权,则引导用户到登录认证服务器中登录。
代码清单 6-7 客户端登录控制器
@RequestMapping("/login") public String login() { return "redirect:/#/"; }
代码清单 6-8 是客户端的一个登出设计,退出时首先通过用户确认,然后使用 POST 方式执行表单 logoutform 的退出提交请求,这个请求已由 Spring Security 实现,执行一些清除会话和登录状态等操作,并将当前操作界面重定向到登出成功页面上。
这里需要注意的是,用户这时只是退出当前客户端而已,并没有在 SSO 服务端中执行过退出请求,也就是说,在 SSO 认证服务端中,还保存着用户的登录状态。如果这时返回原来的客户端,或者访问其他有授权的客户端,都不会要求用户登录并能正常访问。为了能达真正的退出,还必须在 SSO 服务端中再执行一次退出请求。这个退出请求必须由程序来处理,而不能要求用户转到 SSO 服务端中再执行一次退出。
代码清单 6-8 客户端登出设计
<a href="javascript:void(0)" id="logout">[退出 ]</a> ...... <form th:action="@{/logout}" method="post" id="logoutform"> </form> <script type="text/javascript"> $(function () { $("#logout").click(function () { if (confirm('您确定退出吗? ')) { $("#logoutform").submit(); } }); }); </script>
在客户端配置中有一个成功退出的链接地址,当用户在客户端中成功退出时,将被重定向到这个链接地址。代码清单 6-9 是这个链接的页面设计,它只做一件简单的事情,即在当前页面中做一个跳转链接,转到 SSO 服务端中执行退出请求。
代码清单 6-9 跳转到 SSO 服务端中执行登出
<script> function to_sso(){ location.href = "http://localhost/signout"; } </script> <body onload="to_sso()"> </body>
代码清单 6-10 是 SSO 服务端的登出控制器设计,只有请求这个链接,才能让用户完全退出当前的登录状态。程序中使用 request.logout()来请求 Spring Security 执行退出请求,然后返回到 SSO 的登录界面,以刷新当前的页面状态。
代码清单 6-10 SSO 服务端登出控制器
@RequestMapping("/signout") public String signout(HttpServletRequest request) throws Exception{ request.logout(); return "tologin"; }
代码清单 6-11 是接收上面的请求后,返回的一个页面设计,它同样也只做一件简单的事情,即将当前页面跳转到用户登录界面上。
代码清单 6-11 跳转到登录界面
<script> function new_window(){ location.href = "/login"; } </script> <body onload="new_window()"> </body>
这样,用户不管在哪个客户端中执行退出,通过上面的跳转,最终都将被引导到 SSO 服务端的登录界面上。通过这些流程的处理,用户的一个退出请求才能彻底退出登录状态。当然,上面这些跳转对于用户来说,是完全透明的。
用户打开任何一个客户端的页面进行登录,登录成功后将被引导到最初打开的页面上。如果用户直接在 SSO 认证服务端上登录,必须有一个成功登录后的默认主页,这个页面可以配置一些其他客户端的导航链接。因为把登录成功的默认主页设计放置在客户端 1 的主页上,所以如果用户从 SSO 服务器中直接登录,就可以在 SSO 服务器的主页上做一个跳转,如代码清单 6-12 所示,将跳转到客户端 1 的主页上。
代码清单 6-12 登录成功的默认链接设计
<script> <!-- function new_window(){ location.href = "http://localhost:8081/"; } // --> </script> <!-- onload="new_window()"--> <body onload="new_window()"> ......请稍候 </body>
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论