1. 概述

CAS(Central Authentication Service)中央认证服务,一种独立开放指令协议,CAS是耶鲁大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法。
特点如下:
开源的企业级单点登录解决方案

  • CAS Server为需要独立部署的Web应用
  • CAS Client支持非常多的客户端(单点登录系统中各个Web应用)
  • CAS属于Apache2.0许可证,允许代码修改,再发布

CAS主要包括两部分,CAS Server和CAS Client,CAS Server需要独立部署,主要负责对用户的认证工作,CAS Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server
术语
TGT(Ticket Granting Ticket):是用户登录后生成的票根,包含用户的认证身份,有效期等
TGC(Ticket Granted Cookie):是存储在Cookie中的一段数据,类似于会话ID,用户与CAS Server进行交互时,帮助用户找到对应的TGT
ST(Service Ticket):是CAS Server使用TGT签发的一张一次性票据,CAS Client使用ST与CAS Server进行交互,以获取用户的验证状态

2. 搭建CAS Server

2.1. 环境依赖

JDK1.8
Maven3.6.3
Tomcat9.0

2.2. 导入CAS Server项目

GitHub地址下载5.3版本的CAS代码,这是因为5.3版本是使用maven构建的,将下载的项目导入idea中,待下载完所有依赖后,在项目目录结构上会出现overlays目录

saml 单点登录流程 springboot_spring boot

2.3. 制作本地密钥库

由于CAS Server默认使用HTTPS进行访问,要求我们提供一个密钥库,可以使用Java自带的密钥和证书管理工具keytool制作本地密钥库,在CMD命令提示符中输入以下命令keytool -genkey -alias casserver -keyalg RSA -keystore E:\File\caskey\casserver.keystore

saml 单点登录流程 springboot_CAS_02


记住此次输入的密码,后面会用到,名字和姓氏输入的域名后面作为CAS访问的域名

使用export子命令导出证书

keytool -export -trustcacerts -alias casserver -file E:\File\caskey\cas.cer -keystore E:\File\caskey\casserver.keystore

saml 单点登录流程 springboot_Server_03


使用import子命令导入证书

keytool -import -trustcacerts -alias casserver -file E:\File\caskey\cas.cer -keystore “D:\Java\jdk1.8.0_291\jre\lib\security\cacerts”

saml 单点登录流程 springboot_单点登录_04


注意后面的路径为jdk的证书库路径,此处的口令为changeit

2.4. 覆盖CAS Server原配置

在项目下新建目录src/main/resources
将刚才生成的casserver.keystore密钥复制到此目录下,并将目录overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.16/WEB-INF/classes下的application.properties复制到此目录下,修改配置文件中配置信息

server.ssl.key-store=classpath:casserver.keystore
server.ssl.key-store-password=123456
server.ssl.key-password=123456

在IDEA的Terminal窗口输入mvn spring-boot:run就可以运行此项目,当启动日志中出现READY图标表示启动成功,在浏览器输入地址https://www.xlhj.com:8443/cas,当出现登录界面表示程序成功运行,默认登录名和密码为casuser/Mellon

saml 单点登录流程 springboot_单点登录_05

2.5. 登录信息配置进数据库

首先在pom.xml文件中添加如下依赖

<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${cas.version}</version>
</dependency>
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jdbc-drivers</artifactId>
    <version>${cas.version}</version>
</dependency>
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jdbc-authentication</artifactId>
    <version>${cas.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.driver.version}</version>
</dependency>

在配置文件中添加配置信息

cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=123456
cas.authn.jdbc.query[0].sql=SELECT * FROM user_info WHERE username = ?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

注意:需要注释掉原默认用户名和密码配置,并在数据库新建一张用户表,有username和password两个字段即可,数据库密码使用MD5加密

2.6. 启动CAS Server和访问

将项目打包,使用Tomcat启动项目,在浏览器输入地址https://www.xlhj.com:8443/cas_overlay_war/login

saml 单点登录流程 springboot_spring boot_06


输入用户名和密码

saml 单点登录流程 springboot_单点登录_07

3. 搭建CAS Client

新建一个springboot工程

3.1. 引入核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>net.unicon.cas</groupId>
        <artifactId>cas-client-autoconfig-support</artifactId>
        <version>${cas-client.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-cas</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

3.2. 配置

server:
  port: 8137
spring:
  application:
    name: springboot-cas
cas:
  server-url-prefix: https://www.xlhj.com:8443/cas_overlay_war
  server-login-url: https://www.xlhj.com:8443/cas_overlay_war/login #服务端登录地址
  client-host-url: http://www.xlhj.com:8137 #客户端地址
  validation-type: cas3

另外需要在服务端配置中添加如下配置

cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

3.3. 编写控制层

@Controller
public class IndexController {

    @RequestMapping("/index")
    public ModelAndView root() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

3.4. 验证

启动项目,在浏览器输入地址http://www.xlhj.com:8137/index,出现下面界面

saml 单点登录流程 springboot_单点登录_08


这是因为CAS默认支持HTTPS,需要修改CAS Server端apache-tomcat-9.0.55\webapps\cas_overlay_war\WEB-INF\classes\services路径下HTTPSandIMAPS-10000001.json文件

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(https|imaps|http)://.*",
  "name" : "HTTPS and IMAPS",
  "id" : 10000001,
  "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  "evaluationOrder" : 10000
}

在serviceId中添加http,再次启动CAS Server服务,浏览器输入地址http://www.xlhj.com:8137/index,会出现CAS登录界面

saml 单点登录流程 springboot_单点登录_09