配置服务器 cas 认证接入的核心步骤是部署 cas client 拦截器并指定服务端地址。以 java web 应用为例,需在 pom.xml 引入客户端依赖,在 web.xml 中配置 casfilter 及参数,并在业务代码中通过 httpservletrequest.isuserauthenticated() 判断登录状态。配置完成后,未登录请求会自动重定向至 cas server 登录页,认证成功后回调当前应用。

CAS Filter 如何配置验证入口与回调地址
配置 CAS Filter 的关键在于设置 casServerUrlPrefix 和 serverName。casServerUrlPrefix 指向 CAS Server 的基础 URL(如 https://cas.example.com/cas),用于生成登录和注销链接。serverName 是当前应用的域名和端口(如 http://app.example.com:8080),用于构建 Service Ticket 的回调地址。此外,需配置 filter-url-pattern 指定需要保护的 URL 路径,通常设为 /* 以保护所有资源。

<!-- pom.xml --> <dependency><groupid>org.jasig.cas.client</groupid><artifactid>cas-client-core</artifactid><version>3.6.4</version></dependency><!-- web.xml --><filter><filter-name>CASFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>https://cas.example.com/cas</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://app.example.com:8080</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
上述配置中,casServerUrlPrefix 为 https://cas.example.com/cas,serverName 为 http://app.example.com:8080。当用户访问 http://app.example.com:8080/protected 时,若未登录,将被重定向至 https://cas.example.com/cas/login?service=http%3A%2F%2Fapp.example.com%3A8080%2Fprotected。验证成功后,CAS Server 会携带 ticket 参数回调该地址,由后续过滤器处理。
Session 管理如何实现单点登出
实现单点登出(SLO)需配置 CAS Single Sign Out Filter 和 CAS Single Sign Out Listener。CAS Single Sign Out Filter 负责监听来自 CAS Server 的登出请求,并销毁本地 Session。CAS Single Sign Out Listener 是一个 ServletContextListener,用于注册一个 HTTP Session 监听器,确保在 Session 创建或销毁时同步状态。此外,需在 CAS Server 端启用 SLO 功能,并在客户端调用登出接口时指向 CAS Server 的 /logout 端点。

<!-- web.xml --> <listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><filter><filter-name>CASSingleSignOutFilter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>CASSingleSignOutFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 登出按钮链接 --><a href="https://cas.example.com/cas/logout?service=http://app.example.com:8080">Logout</a>
在上述配置中,SingleSignOutHttpSessionListener 会在应用启动时注册 Session 监听器。SingleSignOutFilter 会拦截包含 logOutRequest 参数的请求,这是 CAS Server 发送的登出通知。当用户点击登出链接时,请求被转发至 CAS Server,CAS Server 随后向所有已注册的客户端发送异步登出请求,各客户端收到后销毁本地 Session,从而实现单点登出。
如何获取 CAS 返回的用户属性信息
获取 CAS 返回的用户属性需配置 CAS Assertion Thread Local Filter 和 CAS HttpServletRequest Wrapper Filter。CAS Assertion Thread Local Filter 将 CAS Assertion 对象存入线程局部变量,供后续代码访问。CAS HttpServletRequest Wrapper Filter 包装 HttpServletRequest,提供 getRemoteUser() 和 getUserPrincipal() 等方法直接获取用户信息。在业务代码中,可通过 CASUtils.getAssertionFromRequest() 或直接使用包装后的 Request 方法获取属性。
<!-- web.xml -->
<filter><filter-name>CASAssertionThreadLocalFilter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>CASAssertionThreadLocalFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>CASRequestWrapperFilter</filter-name><filter-class>org.jasig.cas.client.servlet.CASFilter$HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CASRequestWrapperFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- Java Code -->
public void doGet(HttpServletRequest request, HttpServletResponse response) {
String user = request.getRemoteUser(); // 获取用户名
Principal principal = request.getUserPrincipal(); // 获取 Principal
if (user != null) {
response.getWriter().write("Hello, " + user);
}
}
在上述代码中,request.getRemoteUser() 返回的是 CAS Server 返回的用户名属性。若 CAS Server 配置了返回额外属性(如邮箱、部门),可通过 principal.getName() 或从 Assertion 中提取。注意,CASAssertionThreadLocalFilter 必须放在 AuthenticationFilter 之后,以确保 Assertion 已存在。若未正确配置顺序,getRemoteUser() 可能返回 null。










