该模式依托服务体系的身份认证服务和基础数据服务,接入的平台可专注于自身的业务扩展,无需关注基础数据的管理和用户认证服务,业务所需的基础数据均来自于服务体系,用户的认证使用服务体系统一的身份认证入口。该认证方式需要平台同步服务体系的基础数据,详见基础数据规范和数据交换规范。
目标:CAS单点登录主要适用于接入到国家服务体系的平台,依赖体系的用户数据进行单点登录。
特点:平台不需要自己的登录界面,直接使用体系提供的CAS登录界面。
访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。
定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。
用户认证:用户身份认证。
发放票据: SSO 服务器会产生一个随机的 Service Ticket。
验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。
传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。
4、开发规范
说明:以下给出的配置是通用的客户端配置Demo,只适合跳转地址固定的场景(即serverName对应的value是固定的)。如有其他特殊需求,需客户端程序自己实现。
1. 先把cas-client-core-3.3.3.jar引入到项目的工程中(一般是lib)目录。
2. 在项目web.xml文件添加以下内容。
<!-- 过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>SSOFilter</filter-name>
<filter-class>
com.whty.aam.client.authentication.AuthenticationFilter
</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value><!—此处配置用户登录的地址-->
http://ip:port/sso/login
</param-value>
<!--这里的server是服务端的IP-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://ip:port</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SSOFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 以下配置的过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>vlidationFilter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value> http://ip:port/url </param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://ip:port</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>vlidationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 用于单点退出配置,通知其他应用单点登出-->
<listener>
<listener-class>
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name> SingleSignOutFilter</filter-name>
<filter-class>
org.jasig.cas.client.session.SingleSignOutFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>SingleSignOutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许服务商通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>httpServletRequestWrapperFilter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>httpServletRequestWrapperFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AssertionThreadLocalFilter</filter-name>
<filter-class>
org.jasig.cas.client.util.AssertionThreadLocalFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>AssertionThreadLocalFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 取得用户的usessionId
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
Map<String,Object> userMap = principal.getAttributes();
String userId=(String)userMap.get("userId");//用户主键Id
String name=(String)userMap.get("name");//用户姓名
String usessionId=(String)userMap.get("usessionId");//用户登录会话Id
请参考该文档https://wiki.jasig.org/display/CASC/Home