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目录
2.3. 制作本地密钥库
由于CAS Server默认使用HTTPS进行访问,要求我们提供一个密钥库,可以使用Java自带的密钥和证书管理工具keytool制作本地密钥库,在CMD命令提示符中输入以下命令keytool -genkey -alias casserver -keyalg RSA -keystore E:\File\caskey\casserver.keystore
记住此次输入的密码,后面会用到,名字和姓氏输入的域名后面作为CAS访问的域名
使用export子命令导出证书
keytool -export -trustcacerts -alias casserver -file E:\File\caskey\cas.cer -keystore E:\File\caskey\casserver.keystore
使用import子命令导入证书
keytool -import -trustcacerts -alias casserver -file E:\File\caskey\cas.cer -keystore “D:\Java\jdk1.8.0_291\jre\lib\security\cacerts”
注意后面的路径为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
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
输入用户名和密码
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,出现下面界面
这是因为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登录界面