type
status
date
slug
summary
tags
category
icon
password
Feb 10, 2024 09:58 AM

一、 CAS服务端搭建

我们可以先使用docker快速搭建一个cas服务端用于单点调试(如果无需搭建可以跳过)
  1. 这里可以前往 DockerHub 搜索 apereo/cas 选择版本来下载
    1. 💡
      这里要确认自己操作系统的架构版本(arm/amd),来下载对应的cas/apereo版本,不用的版本会有差异
  1. 我这里选择apereo/cas:v6.2.2版本
    1. notion image
  1. 拉取 apereo/cas 镜像
    1. 运行 apereo/cas 服务
      1. 运行之后,此时虽然能够正常访问服务端,需要允许http客户端白名单
        1. 编辑 sudo vim /data/volumn/cas/config/cas.properties 文件,添加 server.ssl.enabledcas.serviceRegistry.initFromJson cas.service-registry.json.location 三个参数,完整配置如下:
          1. 配置客户端白名单,授权允许http客户端访问,cd 进入到 /data/volumn/cas/services 目录下,vim 添加 spring-boot-1.json 文件,内容如下:
            1. 修改完成后重启cas服务
              1. 输入 http://xxx:8443/cas 访问,输入用户名/密码casuser/Melon 登录成功
                1. notion image
                  notion image
               
               

              二、SpringBoot集成CAS

               
              CAS认证流程
              notion image
              上图中红色序号说明:
              1) 访问应用系统系统访问地址 http://app.domain.com:8080;
              2) 后端CAS过滤器会验证session,未登录会重定向地址:https://sso.domain.com/cas/login?service=http://app.domain.com:8080重定向到cas认证中心。(service后的参数是回调地址,可以配置);
              3) 认证中心登录后统一用户认证成功后,会在服务端创建全局session TGT,并返回到回调地址 http://xxx.chinaamc.com:8080?ticket=ST-xxxxxxxxxxxxxxxxxxxxxxxxx,ticket票据由CAS Server自动生成;
              4) 应用系统集成cas-client后,会自动获取请求的ticket参数,通过http自动请求服务端验证ticket,校验成功后会访问http://app.domain.com:8080 ,应用系统从request中获取CAS服务端设置的用户名和一些属性信息;
              5) 跳转到应用系统系统的成功页面http://app.domain.com:8080/index;
              6) 校验是否登录成功,是则进入自己系统,否则重复上面的流程。

              CAS单点登录

               
              1. 这里先引入cas集成jar,我这里是SpringBoot3.0+Spring6,对应的cas版本为org.apereo.cas.client
                1. 先创建cas属性文件(CasConfigurationProperties.Java)文件
                  1. 引入cas的过滤器和监听器(CasConfiguration.Java)文件,这里可以通过注解 @ConditionalOnProperty(name = "spring.cas.enable", havingValue = "true") 来通过配置文件控制是否开启cas(不为true或者未配置时不会扫描到此Configuration)
                    1. 配置中心添加相关cas属性配置
                       

                      保留原始登录页面

                      1. 如果需要同时保留原始登录方式(即不走CAS认证的方式),则需要新开一个前端页面和登录url用户原始登录,登录的接口url配置在步骤5中的ignore-pattern属性中, 原始登录方式登录成功后在需要同时写入到cas client的缓存中
                        1. org.apereo.cas.client.authentication.AuthenticationFilter 关键源码
                          notion image

                      单点注销

                      1. 用户在client端注销登录时,client端处理使session失效外,还需要通知cas server注销该用户,即达到所有其他集成单点登录的client系统全部注销;通知的方法为跳转到cas server的注销地址,同时指定注销用户后跳转的地址。
                        1.  

                      前后端分离项目

                      1. 如果是前后端项目,这里还需要重写一下cas的重定向策略(ps:因为前后端分离项目,由浏览器前端发起登录请求,后端接收后cas过滤器会直接重定向到认证中心,此时就发生了跨域),需要从后端将重定向地址返回给前端,由前端进行跳转
                        1. notion image
                          notion image
                      1. 所以需要重写 org.apereo.cas.client.authentication.AuthenticationFilterorg.apereo.cas.client.authentication.DefaultAuthenticationRedirectStrategy 两个类,重写自定义过滤器 CustomAuthenticationFilter (这里不贴全部的代码了,主要将默认的策略类修改为自定义重定向策略类
                        1. 重写自定义重定向策略类 CustomAuthRedirectStrategy ,调整 redirect方法 的代码
                      1. 前端处理跳转主要代码