返回介绍

6.4 SSO 客户端

发布于 2025-04-26 13:26:34 字数 4281 浏览 0 评论 0 收藏

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>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。