CAS单点登录

1使用场景

该模式依托服务体系的身份认证服务和基础数据服务,接入的平台可专注于自身的业务扩展,无需关注基础数据的管理和用户认证服务,业务所需的基础数据均来自于服务体系,用户的认证使用服务体系统一的身份认证入口。该认证方式需要平台同步服务体系的基础数据,详见基础数据规范和数据交换规范。

目标:CAS单点登录主要适用于接入到国家服务体系的平台,依赖体系的用户数据进行单点登录。

特点:平台不需要自己的登录界面,直接使用体系提供的CAS登录界面。


2原理图

访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。

定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。

用户认证:用户身份认证。

发放票据: SSO 服务器会产生一个随机的 Service Ticket。

验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。

传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。


3时序图

4开发规范

说明:以下给出的配置是通用的客户端配置Demo,只适合跳转地址固定的场景(即serverName对应的value是固定的)。如有其他特殊需求,需客户端程序自己实现。

(1)Java语言客户端配置

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

(2)其他语言配置流程说明

请参考该文档https://wiki.jasig.org/display/CASC/Home