一、前言
CAS(Central Authentication Service)即中央认证服务,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案,它是一个企业级的开源单点认证登录解决方案,采用java语言编写,使用Apache-2.0协议,主要用于为Web应用程序创建和维护单点登录会话。它提供了一个安全可靠的方式来验证用户的身份,并且可以集成到各种Web应用程序中。CAS提供了多种认证机制,包括基于令牌的认证、基于密码的认证和多因素认证等。此外,它还支持多种协议,如CAS、OAuth、SAML等,这使得它可以与各种不同的Web应用程序集成。目前,GitHub上显示最新版为v7.0.6。
在单点登录(SSO)环境中,CAS充当了一个中心认证服务器,负责验证用户的身份,并生成会话令牌,该令牌可以由其他应用程序用于验证用户的身份。这样,用户只需要在一个应用程序中登录,就可以在其他应用程序中无缝地访问,而无需再次输入用户名和密码。
关联资源:CAS Gitee项目、CAS GitHub、官网、 Apereo Foundation、cas相关博客、版本发布里程碑、版本发布和下载、CAS本地构建指导、Troubleshooting、cas-initializr 官方的war生成管理工具、配置参考
二、CAS产品原理及特性
2.1、CAS工作原理
上图为官网的架构,可看出CAS系统由2个组件: CAS server和 clients组成;其中,CAS server是基于Spring Framework构建的Java servlet(JavaWeb中基于spring部署在Servlet容器中的一个应用),CAS的核心是一个基于Java的web应用程序;CAS负责颁发和验证票证来验证用户并对支持CAS的服务(通常称为CAS客户端)授权访问。当服务器成功登录后向用户发出授权的票证(TGT)时,会创建一个SSO会话。之后,那些用户通过浏览器发出的请求服务所需要的**服务票证(ST)**就会被重定向到TGT,从而用它来作为token通过浏览器向CAS server后端完成验证ST。
CAS client 有2种含义,除了官方的client组件,还泛指所有支持cas的服务应用,只要能通过cas支持的协议 (e.g. CAS, SAML, OAuth).与CAS server能通信就算,常见有:Apache httpd Server (mod_auth_cas module)、Java (Java CAS Client)、NET (.NET CAS Client)、Python (pycas)、Ruby (rubycas-client),它更像是指一个诸如向Java CAS客户端之类的集成组件集。
如上所示,CAS的工作原理如下:
- 1、当用户通过浏览器访问A系统统提供的服务资源时,首先验证用户是否登录,否则就会由后端服务(cas client)重定向到用户登录界面,而该登录界面的认证服务会重定向用户请求到 CAS Server 服务器
- 2、用户在浏览器输入认证信息,发送给cas server验证授权票证,同时会为登录成功的用户创建一个会话并颁发一个随机的 Service Ticket ,该会话携带的TGT就是用户当前所请求服务的ST;
- 3、然后,之后所有的请求服务都使用该ST来向cas服务进行票证验证合法性,通过后就授权给当前用户访问权限,返回用户所请求的资源/服务的请求应答。
对于访问受保护资源的每个 Web 请求, CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket。如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。
2.2、CAS特性
CAS 构建于 Spring Boot 或 Spring Cloud之上,支持以下特性:
- CAS v1, v2 和 v3 协议
- SAML v1 和 v2 协议
- OAuth v2 协议
- OpenID & OpenID Connect 协议
- WS-Federation 被动请求者协议
- 通过 JAAS, LDAP, RDBMS, X.509, Radius, SPNEGO, JWT, Remote, Trusted, BASIC, Apache Shiro, MongoDb, Pac4J 等组件进行身份验证
- 将身份验证委派至 WS-FED, Facebook, Twitter, SAML IdP, OpenID, OpenID Connect, CAS 等服务来完成;
- 通过 ABAC, Time/Date, REST, Internet2 的 Grouper 等进行身份验证
- 通过 Hazelcast, Ehcache, JPA, Memcached, Apache Ignite, MongoDb, Redis, DynamoDb, Couchbase 等工具进行 HA 集群部署
- 借助JSON, LDAP, YAML, JPA, Couchbase, MongoDb, DynamoDb, Redis 等工具支持的应用程序注册
- 通过 Duo Security, YubiKey, RSA, Google Authenticator 等进行多因子身份验证
- 用于管理日志记录、监控、统计、配置和客户端注册等的管理 UI
- 密码管理和密码策略实施
- 支持基于Apache Tomcat, Jetty, Undertow, packaged 或Docker containers方式进行部署
2.3、部署前准备
- CAS大版本依赖JDK 21,一般只有大版本升级时才会涉及到JDK的变动
- 选一个你熟悉的servlet containers,对此官方并没有特别指定,最常用莫过Tomcat了,推荐选择嵌入式servlet容器进行部署
- WAR Overlay来打一个war包
- 联网更好:因为构建时可自动下载诸如WAR Overlay和线上仓库总的一些依赖库
- 至少双核 3.00Ghz CPU + 4GB 内存
- 软件获取:官网声明,请勿直接克隆或下载CAS代码库。除非你想为项目开发贡献代码,推荐采用 WAR Overlay 模式部署
三、部署和配置
也可直接参看SpringBoot 实现CAS Server统一登录认证
完成后,就可访问本地tomcat服务http://localhost:8080/cas就能看到登录页面了,默认的账密为:casuser/Mellon,该密码的配置在如下目录内WEB-INF\classes\application.properties;如下所示: