本文目录导读:

CAS(Central Authentication Service,中央认证服务)是一种常用的单点登录(SSO)协议,集成CAS通常涉及三个角色:CAS服务器(负责认证)、CAS客户端(受保护的应用)、用户浏览器。
下面是一个通用的、技术中立的集成步骤指南,以及针对不同技术栈的具体建议。
核心流程(理解原理)
在动手编码前,理解这个流程至关重要:
- 用户访问:用户尝试访问受保护的客户端应用。
- 重定向到CAS:客户端检测到未登录,将用户重定向到CAS服务器的登录页面(URL包含回调地址
service=)。 - 用户登录:用户在CAS服务器上输入用户名/密码(或通过其他认证方式)。
- 发放票据:认证成功后,CAS服务器生成一个一次性票据(Ticket Granting Ticket, TGT 在服务端,Service Ticket, ST 在URL中),并将用户浏览器重定向回客户端应用,URL上带有一个
ticket=...参数。 - 验证票据:客户端应用收到票据后,在后台(通常是服务器端)向CAS服务器发起请求,验证此票据是否有效。
- 建立会话:CAS服务器确认票据有效,客户端应用获知用户身份,并建立自己的本地会话(如Session),返回资源给用户。
集成步骤(通用)
第一步:搭建或获取 CAS 服务器
- 选项A(标准):使用 Apereo CAS 官方项目,这是一个Java Web应用,需要部署在Tomcat、Jetty等容器中。
- 选项B(托管/简化):使用云服务(如Okta、Auth0)或开源替代(如Keycloak)提供的CAS协议支持。
- 配置:配置数据源(数据库、LDAP等)、认证策略、HTTPS(CAS强制要求生产环境使用HTTPS)。
第二步:配置客户端应用
你的应用需要作为“CAS客户端”来启动上述流程,通常有两种方式:
-
使用CAS客户端库(推荐)
- Java(Spring Boot/Spring Security):
- 添加依赖
pac4j-springboot或cas-client-core或spring-security-cas。 - 配置
cas.server-url-prefix和cas.client-server-name(你的应用地址)。 - 在Spring Security配置中启用CAS认证。
- 添加依赖
- Python(Django/Flask):
- 使用
django-cas-ng(Django)或flask-cas。 - 配置
CAS_SERVER_URL和APP_SERVICE_URL。
- 使用
- PHP:
- 使用
phpCAS库(最经典)。 - 调用
phpCAS::client(...)并初始化。
- 使用
- Node.js:
- 使用
cas-authentication或passport-cas(配合Passport.js)。
- 使用
- .NET:
- 使用
DotNetCasClient或AspNet.Security.Cas.Client。
- 使用
- Java(Spring Boot/Spring Security):
-
手动实现协议交互(不推荐,除非无法使用库)
- 你需要在代码中:
- 捕获未认证请求,重定向到CAS登录URL(格式:
https://cas-server/login?service=https://yourapp/login/cas)。 - 解析回调URL中的
ticket参数。 - 发起HTTP GET请求到CAS服务器:
https://cas-server/serviceValidate?ticket=ST-...&service=...。 - 解析返回的XML或JSON,获取用户信息(
<cas:user>标签)。
- 捕获未认证请求,重定向到CAS登录URL(格式:
- 你需要在代码中:
第三步:处理登出(Logout)
SSO需要全局登出。
- 单点登出(SLO, Single Log Out):
- 用户在一个应用中点击登出,通知CAS服务器。
- CAS服务器向所有已登录的应用发送登出请求(通常是后台HTTP POST请求)。
- 客户端应用需要监听这个请求,并销毁本地会话。
- 实现SLO需要客户端应用暴露一个特定的登出回调URL(如
/cas/logout),CAS服务器会调用它。
第四步:HTTPS 配置
CAS协议要求所有请求都通过HTTPS进行,否则票据容易被窃取,确保你的CAS服务器和所有客户端应用都配置了有效的SSL证书。
常见问题与调试
- 票据错误:
Ticket not recognized:通常是因为票据过期(默认很短,如30秒)或service参数不匹配(客户端注册的地址与回调时发来的地址必须完全一致,包括http/https、端口、路径)。
- 重定向循环:
- 通常因为客户端没有正确配置
cas.server-name或没有配置为信任CAS服务器。 - 检查Session是否成功建立。
- 通常因为客户端没有正确配置
- 跨域问题(CORS):
- CAS服务器和客户端通常在不同域名,这可能引发CORS问题,但CAS依赖重定向而不是AJAX,所以通常不涉及CORS,除非你做了特殊的前端API调用。
- 代理模式:
- 如果你的客户端应用无法直接访问CAS服务器(例如在内网,而CAS在公网),需要使用代理模式,客户端持有一个代理票据(Proxy Ticket, PT),由后端代理转发请求,实现更复杂,但通常较少遇到。
- 最省力:找一个成熟的CAS客户端库(如
phpCAS、pac4j)。 - 最可控:自己解析重定向和XML/JSON,但重复造轮子。
- 最易错:忽略
service参数的精确匹配和票据过期时间。 - 最重要:必须使用HTTPS。
如果你想针对特定技术栈(例如Java Spring Boot、Python Django、PHP)获得更详细的配置代码示例,可以告诉我,我可以提供具体的依赖和配置片段。