CAS 实现的单点登录
——任何的成功都不是一蹴而就,经验需要慢慢积累、沉淀!项目里面用到了CAS单点登录,最近也简单的从应用层面简单研究了下CAS这个开源架构。1. 基本概念:cookie, session, 会话cookie, jssessionid- cookie 和 session机制都是为了解决HTTP协议的无状态性而生的- cookie 是客户端保存用户信息的机制- sessi
——任何的成功都不是一蹴而就,经验需要慢慢积累、沉淀!
项目里面用到了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 等。
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)