——任何的成功都不是一蹴而就,经验需要慢慢积累、沉淀!

项目里面用到了CAS单点登录,最近也简单的从应用层面简单研究了下CAS这个开源架构。


1. 基本概念:cookie, session, 会话cookie, jssessionid

- cookie 和 session机制都是为了解决HTTP协议的无状态性而生的

- cookie 是客户端保存用户信息的机制

- session 是服务器端保存用户信息的机制

- cookie其实就是保存在浏览器中的一小段文本,当浏览器第一次访问jsp时,jsp response会给浏览器生成一个cookie,然后浏览器会存储它

- cookie 具有不可跨域性

- cookie 和session 联合使用可以解决跨域记录用户信息的问题

- 为了使浏览器记住服务器上的session,浏览器会生成一个id , 这个id就叫做jsessionid

- 另外,由于一些浏览器禁用cookie, Java EE标准 退出了URL重写,使url里面记录jssessionid

- 上述让浏览器记住服务器上的session的形式就叫做会话cookie,会话cookie在用户登出或者浏览器关闭后自动删除,这样就叫做一次会话。

理解了上面的基本概念和标准,对于理解cas的实现和基本流程很有帮助,cas这样的sso解决方案本来就是构建在cookie和session标准之上的。


2. SSO 和 CAS 介绍

SSO 单点登录,是企业为了解决在相互信任的系统上实现一次登录的解决方案。CAS 是SSO解决方案里面比较成熟的架构,是耶鲁大学发起的一个开源架构。

CAS 具有以下特点:
- 开源的企业级单点登录解决方案。
- CAS Server 为需要独立部署的 Web 应用。
- CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。


3. CAS 基本流程


CAS 基本流程 一文已经有相当详细的介绍了。


4. 基本配置

下面给出了项目中关于cas 单点登录的配置:

<!-- ======================== 单点登录配置开始 ======================== -->
	<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
	<filter>
		<filter-name>SSOFilter</filter-name>
		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>SSOFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>SSOFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>SSOFilter</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>

	<!-- 该过滤器负责用户登陆的心跳判断 -->
	<filter>
		<filter-name>AuthHeartFilter</filter-name>
		<filter-class>com.whty.cms.web.common.filter.AuthenticationHeartFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AuthHeartFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>AuthHeartFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

	<!-- 该过滤器负责用户的认证工作,必须启用它 -->
	<filter>
		<filter-name>AuthFilter</filter-name>
		<filter-class>com.whty.cms.common.filter.AuthenticationFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AuthFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>AuthFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>

	<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
	<filter>
		<filter-name>TicketValidFilter</filter-name>
		<filter-class>com.whty.cms.common.filter.Cas20ProxyReceivingTicketValidationFilter</filter-class>
		<init-param>
			<param-name>casServerUrlPrefix</param-name>
			<param-value>http://yuncs.zjer.cn:30014/aamif/ticketValidate</param-value>
		</init-param>
		<init-param>
			<param-name>redirectAfterValidation</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>artifactParameterName</param-name>
			<param-value>ticket</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>TicketValidFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>TicketValidFilter</filter-name>
		<url-pattern>*.htm</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>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>HttpServletRequestWrapperFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>

	<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
	<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>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>AssertionThreadLocalFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>

	<!-- 自动根据单点登录的结果设置本系统的用户信息 -->
	<filter>
		<filter-name>AutoSetUserAdapterFilter</filter-name>
		<filter-class>com.whty.cms.web.common.filter.PortalAutoSetUserAdapterFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AutoSetUserAdapterFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>AutoSetUserAdapterFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>
	<!-- ======================== 单点登录配置结束 ======================== -->

这里的cas是由servlet的filter chain 整合到web 应用当中的,每个filter 都是一个独立的cas模块,都有自己独立的功能。

注意理解filter 实现sso 对于理解单点登录和cas的流程很有帮助,在做架构设计的时候,要能够通过看xml配置文件,脑海里自动浮现一幅cas 单点登录的流程图、ER图、时序图。


参考:

1. http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html

2. http://blog.csdn.net/fangaoxin/article/details/6952954

3. http://www.cnblogs.com/shanyou/archive/2009/08/30/1556659.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐