• SpringBoot 基于 CAS 实现单点登录登出


    1、下载 CAS 5.3 源码:

    git clone https://github.com/apereo/cas-overlay-template.git

    由于以上命令会拷贝 CAS 的最新版本,如需切换到历史版本,可执行如下操作:

    1)cd 到该项目下;

    2)git log 查看提交记录,找到想要的提交记录,粘贴对应的哈希值;

    3)执行 git checkout 哈希值;

    这时本地的代码就会变成你想要的那个版本的代码。

    2、将下载的源码导入 Idea:

    (1)目录结构如下(CAS5.3 采用 maven 项目结构):

    (2)打开 POM.XML 文件,更换 repositories :

        <!-- 注释以下部分,因为使用的是国外的仓库,下载速度较慢 -->
        <!--<repositories>
            <repository>
                <id>sonatype-releases</id>
                <url>http://oss.sonatype.org/content/repositories/releases/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <releases>
                    <enabled>true</enabled>
                </releases>
            </repository>
            <repository>
                <id>sonatype-snapshots</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
            <repository>
                <id>shibboleth-releases</id>
                <url>https://build.shibboleth.net/nexus/content/repositories/releases</url>
            </repository>
        </repositories>-->
    
        <!-- 添加阿里的仓库 -->
        <repositories>
            <repository>
                <id>central</id>
                <name>aliyun maven</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <!-- 是否开启发布版构件下载 -->
                <releases>
                    <enabled>true</enabled>
                </releases>
                <!-- 是否开启快照版构件下载 -->
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>

    3、对源码进行打包:

    打包完成后会生成一个 target 目录:

    4、将打包后的 cas 文件夹复制到 tomcat 的 webapps 目录下:

    5、修改CAS服务端配置文件:
    (1)在 casWEB-INFclasses 目录的 application.properties 添加如下的内容:

    # 自定义cas 登录用户名和密码为 admin

    #cas.authn.accept.users=casuser::Mellon
    cas.authn.accept.users=admin::admin

    # 兼容 Http 协议
    cas.tgc.secure=false
    # 开启识别Json文件,默认false
    cas.serviceRegistry.initFromJson=true

    # 允许退出登录后重定向到其他页面
    cas.logout.followServiceRedirects=true

    (2)在 casWEB-INFclassesservices 目录下的 HTTPSandIMAPS-10000001.json:

    修改内容如下,即添加http
    "serviceId" : "^(https|http|imaps)://.*",

    6、启动 tomcat 查看是否可以启动 CAS Server:

    如上,已成功访问 CAS Server 登录页。

    7、 CAS 客户端配置:

    (1)项目结构:

     项目结构为 maven 多模块工程,其中sp-common模块为公用模块;sp-member 为会员模块;sp-order 为订单模块。

    (2)POM.XML 依赖:

    <dependency>
      <groupId>net.unicon.cas</groupId>
      <artifactId>cas-client-autoconfig-support</artifactId>
      <version>2.1.0-GA</version>
    </dependency>

    (3)application.yml 配置:

    1)客户端 sp-member 模块配置如下:

    server:
      port: 8081
    
    # 配置 cas server 信息
    cas:
      # cas服务端的地址
      server-url-prefix: http://localhost:8080/cas
      # cas服务端的登录地址
      server-login-url: http://localhost:8080/cas/login
      # 当前服务器的地址(客户端)
      client-host-url: http://localhost:8081
      # Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
      validation-type: cas3

    2)客户端 sp-order 模块配置如下:

    server:
      port: 8082
    
    # 配置 cas server 信息
    cas:
      # cas服务端的地址
      server-url-prefix: http://localhost:8080/cas
      # cas服务端的登录地址
      server-login-url: http://localhost:8080/cas/login
      # 当前服务器的地址(客户端)
      client-host-url: http://localhost:8082
      # Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
      validation-type: cas3

    8、进行客户端测试:

    (1)客户端 sp-member模块配置如下:

    MemberController 类:

    package member.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    @Controller
    public class MemberController {
    
        @RequestMapping("/test")
        @ResponseBody
        public String test(HttpServletRequest request) {
            return "member";
        }
    
        /**
         * 退出
         * @param request
         * @return
         */
        @RequestMapping("/logout")
        public String logout(HttpServletRequest request) {
            HttpSession session = request.getSession();
            session.invalidate();
            return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/logoutSuccess";
    
        }
    
        /**
         * 退出成功页
         * @return
         */
        @RequestMapping("/logoutSuccess")
        @ResponseBody
        public String logoutSuccess() {
            return "member logoutSuccess";
        }
    
    }

    StartMember8081类(启动类):

    package member;
    
    /**
     * 会员服务启动类
     */
    import net.unicon.cas.client.configuration.EnableCasClient;
    import org.jasig.cas.client.authentication.AuthenticationFilter;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @EnableCasClient        // 开启 Cas Client 注解
    @SpringBootApplication
    public class StartMember8081 {
    
        private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
        private static final String SERVER_NAME = "http://localhost:8081/";
    
        @Bean
        public FilterRegistrationBean filterAuthenticationRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            // AuthenticationFilter  该过滤器负责用户的认证工作
            registration.setFilter(new AuthenticationFilter());
            // 设定匹配的路径
            registration.addUrlPatterns("/*");
            Map<String,String> initParameters = new HashMap<String, String>();
            initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
            initParameters.put("serverName", SERVER_NAME);
            // 忽略 /logoutSuccess 的路径
            initParameters.put("ignorePattern", "/logoutSuccess/*");
            registration.setInitParameters(initParameters);
            // 设定加载的顺序
            registration.setOrder(1);
            return registration;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(StartMember8081.class, args);
        }
    
    
    }

    (2)客户端 sp-order 模块配置如下:

    OrderController类:

    package order.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    @Controller
    public class OrderController {
    
        @RequestMapping("/test")
        @ResponseBody
        public String test() {
            return "order";
        }
    
        /**
         * 退出
         * @param request
         * @return
         */
        @RequestMapping("/logout")
        public String logout(HttpServletRequest request) {
            HttpSession session = request.getSession();
            session.invalidate();
            return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8082/logoutSuccess";
    
        }
    
        /**
         * 退出成功页
         * @return
         */
        @RequestMapping("/logoutSuccess")
        @ResponseBody
        public String logoutSuccess() {
            return "order logoutSuccess";
        }
    
    
    }

    StartOrder8082类(启动类):

    package order;
    
    import net.unicon.cas.client.configuration.EnableCasClient;
    import org.jasig.cas.client.authentication.AuthenticationFilter;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 订单服务启动类
     */
    @EnableCasClient        // 开启 Cas Client 注解
    @SpringBootApplication
    public class StartOrder8082 {
    
        private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
        private static final String SERVER_NAME = "http://localhost:8082/";
    
        @Bean
        public FilterRegistrationBean filterAuthenticationRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new AuthenticationFilter());
            // 设定匹配的路径
            registration.addUrlPatterns("/*");
            Map<String,String> initParameters = new HashMap<String, String>();
            initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
            initParameters.put("serverName", SERVER_NAME);
            // 忽略 /logoutSuccess 的路径
            initParameters.put("ignorePattern", "/logoutSuccess/*");
            registration.setInitParameters(initParameters);
            // 设定加载的顺序
            registration.setOrder(1);
            System.out.println("init filter");
    
            return registration;
        }
    
    
        public static void main(String[] args) {
            SpringApplication.run(StartOrder8082.class, args);
        }
    }

    (3)测试访问(会员业务) http://localhost:8081/test 是否会被拦截:

    如上,会员服务接口已被成功拦截,地址重定向了 CAS Server 的登录页面。

    (4)测试访问(订单服务) http://localhost:8082/test 是否会被拦截:

    如上,订单服务接口也成功被拦截。

    (5)测试当一个客户端登录后,另外一个客户端是否可以访问:

     如上,登录后成功返回会员服务内容。

    如上,刷新刚刚订单服务请求地址,也成功返回订单服务内容。

    (6)测试当一个客户端退出后,另外一个客户端是否还可以访问:

     

    如上,先在浏览器访问 http://localhost:8081/logout 接口,url 重定到 http://localhost:8081/logoutSuccess 接口,即表示会员服务已退出。

    这时再刷新之前两个服务的接口地址,均重定向到了 CAS Server 登录页,即实现了单点登出效果。

    参考链接:https://www.jianshu.com/p/f2facc4d1c3a

    艺无止境,诚惶诚恐, 感谢开源贡献者的努力!!
  • 相关阅读:
    python生成随机密码
    python计算md5值
    python---连接MySQL第五页
    python---连接MySQL第四页
    梯度下降(Gradient Descent)小结
    矩阵的线性代数意义
    矩阵的意义
    偏导数与全导数的关系 以及 偏微分与全微分的关系
    mysql-blog
    python及numpy,pandas易混淆的点
  • 原文地址:https://www.cnblogs.com/d0usr/p/12403736.html
Copyright © 2020-2023  润新知