[关闭]
@huynh 2016-03-24T00:43:13.000000Z 字数 8023 阅读 2545

单点登录CAS

cas 单点登录


一、服务器配置 cas-server-4.0.0

1. 使用https安全方式部署

2. 使用http不安全方式部署

3. 服务器配置数据库

参考:http://blog.csdn.net/ahpo/article/details/46412859

  1. <dependency>
  2. <groupId>org.apache.openejb</groupId>
  3. <artifactId>commons-dbcp-all</artifactId>
  4. <version>1.3-r699049</version>
  5. </dependency>
  1. commons-pool-1.6.jar(数据库连接池可以使用别的)
  1. <dependency>
  2. <groupId>commons-pool</groupId>
  3. <artifactId>commons-pool&</artifactId>
  4. <version>1.6</version>
  5. </dependency>

1. 先创建一个bean,id随便,如下:

  1. <bean id="**dbAuthHandler**"
  2. class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  3. <property name="dataSource" ref="dataSource"/>
  4. <property name="sql" value="select password from user where name = ?"/>
  5. </bean>

2. 将1创建的bean加入authenticationManager

将id=authenticationManager的bean中map值key=primaryAuthenticationHandler的改为key=自定义的bean,这个bean的class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler",原来的primaryAuthenticationHandler就不用了。
如下:

3. 创建dataSource的bean

  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  2. <property name="driverClassName">
  3. <value>com.mysql.jdbc.Driver</value>
  4. </property>
  5. <property name="url">
  6. <value>jdbc:mysql://127.0.0.1:3306/user</value>
  7. </property>
  8. <property name="username">
  9. <value>root</value>
  10. </property>
  11. <property name="password">
  12. <value>admin</value>
  13. </property>
  14. </bean>

4. 启动测试

二、客户端配置 cas-client-3.3.3

参考http://blog.csdn.net/small_love/article/details/6664831
http://blog.csdn.net/yuwenruli/article/details/6600032

  1. <!-- ======================== 单点登录开始 ======================== -->
  2. <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
  3. <listener>
  4. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  5. </listener>
  6. <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
  7. <filter>
  8. <filter-name>CAS Single Sign Out Filter</filter-name>
  9. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  10. </filter>
  11. <filter-mapping>
  12. <filter-name>CAS Single Sign Out Filter</filter-name>
  13. <url-pattern>/*</url-pattern>
  14. </filter-mapping>
  15. <!-- 该过滤器负责用户的认证工作,必须启用它 -->
  16. <filter>
  17. <filter-name>CASFilter</filter-name>
  18. <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
  19. <init-param>
  20. <param-name>casServerLoginUrl</param-name>
  21. <param-value>http://localhost:8080/cas/login</param-value>
  22. <!--这里的server是服务端的IP -->
  23. </init-param>
  24. <init-param>
  25. <param-name>serverName</param-name>
  26. <param-value>http://localhost:8080</param-value>
  27. </init-param>
  28. </filter>
  29. <filter-mapping>
  30. <filter-name>CASFilter</filter-name>
  31. <url-pattern>/*</url-pattern>
  32. </filter-mapping>
  33. <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
  34. <filter>
  35. <filter-name>CAS Validation Filter</filter-name>
  36. <filter-class>
  37. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
  38. <init-param>
  39. <param-name>casServerUrlPrefix</param-name>
  40. <param-value>http://localhost:8080/cas</param-value>
  41. </init-param>
  42. <init-param>
  43. <param-name>serverName</param-name>
  44. <param-value>http://localhost:8080</param-value>
  45. </init-param>
  46. </filter>
  47. <filter-mapping>
  48. <filter-name>CAS Validation Filter</filter-name>
  49. <url-pattern>/*</url-pattern>
  50. </filter-mapping>
  51. <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
  52. <filter>
  53. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  54. <filter-class>
  55. org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  56. </filter>
  57. <filter-mapping>
  58. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  59. <url-pattern>/*</url-pattern>
  60. </filter-mapping>
  61. <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
  62. <filter>
  63. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  64. <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  65. </filter>
  66. <filter-mapping>
  67. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  68. <url-pattern>/*</url-pattern>
  69. </filter-mapping>
  70. <!-- ======================== 单点登录结束 ======================== -->
  1. <dependency>
  2. <groupId>org.jasig.cas.client</groupId>
  3. <artifactId>cas-client-core</artifactId>
  4. <version>3.3.3</version>
  5. </dependency>

cas原理

CAS 系统中设计了 5 中票据: TGC 、 ST 、 PGT 、 PGTIOU 、 PT 。

Ø Ticket-granting cookie(TGC) :存放用户身份认证凭证的 cookie ,在浏览器和 CAS Server 间通讯时使用,并且只能基于安全通道传输( Https ),是 CAS Server 用来明确用户身份的凭证;这个是实现多系统只需登录一次的关键。

Ø Service ticket(ST) :服务票据,服务的惟一标识码 , 由 CAS Server 发出( Http 传送),通过客户端浏览器到达业务服务器端;一个特定的服务只能有一个惟一的 ST ;

Ø Proxy-Granting ticket ( PGT ):由 CAS Server 颁发给拥有 ST 凭证的服务, PGT 绑定一个用户的特定服务,使其拥有向 CAS Server 申请,获得 PT 的能力;

Ø Proxy-Granting Ticket I Owe You ( PGTIOU ) : 作用是将通过凭证校验时的应答信息由 CAS Server 返回给 CAS Client ,同时,与该 PGTIOU 对应的 PGT 将通过回调链接传给 Web 应用。 Web 应用负责维护 PGTIOU 与 PGT 之 间映射关系的内容表;

Ø Proxy Ticket (PT) :是应用程序代理用户身份对目标程序进行访问的凭证;

如上图: CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同 时, CAS Client 会分析 HTTP 请求中是否包含请求 Service Ticket( ST 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的;于是 CAS Client 会重定向用户请求到 CAS Server ( Step 2 ),并传递 Service (要访问的目的资源地址)。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials , CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket ,并缓存以待将来验证,并且重定向用户到 Service 所在地址(附带刚才产生的 Service Ticket ) , 并为客户端浏览器设置一个 Ticket Granted Cookie ( TGC ) ; CAS Client 在拿到 Service 和新产生的 Ticket 过后,在 Step 5 和 Step6 中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS Server 的交互均采用 SSL 协议,以确保 ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向 的过程。但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的(使用 HttpsURLConnection )。

时序图:
时序图

当用户访问另一个应用的服务再次被重定向到 CAS Server 的时候, CAS Server 会主动获到这个 TGC cookie ,然后做下面的事情:
1) 如果 User 持有 TGC 且其还没失效,那么就走基础协议图的 Step4 ,达到了 SSO 的效果;
2) 如果 TGC 失效,那么用户还是要重新认证 ( 走基础协议图的 Step3) 。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注