java单点登录系统CAS的简单使用

转:http://blog.csdn.net/yunye114105/article/details/7997041

背景

有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在使用不同的系统的时候,需要登陆不同的系统。现在需要提供一个统一的登陆/登出界面, 而不修改各个系统原来的登陆验证机制。于是采用单点登录系统CAS。

使用步骤

要使用单点登录,需要部署CAS系统, CAS服务端可以直接部署在tomcat下运行, 对于CAS服务端来说,所有要集成单点登录的web应用都是它的一个客户端, CAS有客户端jar包, 客户端web应用需要引入CAS客户端的jar包,这样CAS系统的服务端和客户端web应用程序端才能通信。

客户端web应用程序的通过配置web.xml,添加CAS需要的各种过滤器,来实现和CAS服务器通信, 用户信息验证工作在CAS服务端统一完成, 验证通过后,客户端web应用程序只需要补全自己的Session信息即可。

各个客户端web应用程序需要使用一个公用的用户表。

第一步 部署CAS系统服务端

1.从官网http://www.jasig.org下载CAS Server, 将cas-server-webapp-3.4.12.war解压, 可以看到是一个标准的java的web应用, 可以直接部署到tomcat的webapps目录下的,我这里假设部署的路径是{tomcat_home}/webapps/cas。

2. CAS默认需要tomcat配置SSL协议,使用https协议通信的。 由于项目是企事业单位内部的系统,不需要这么高的安全级别, 可以简化操作,不走SSL协议。修改下配置文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml, 如下, 将默认的true改成false即可。

[html] view plain copy

  1. <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
  2. p:cookieSecure="false"
  3. p:cookieMaxAge="-1"
  4. p:cookieName="CASTGC"
  5. p:cookiePath="/cas" />

3.配置登录的验证逻辑, 修改配置文件cas\WEB-INF\deployerConfigContext.xml。在authenticationHandlers中配置验证方式,我这里配置数据库查询语句来实现用户名和密码的验证。

[html] view plain copy

  1. <property name="authenticationHandlers">
  2. <list>
  3. <!--
  4. | This is the authentication handler that authenticates services by means of callback via SSL, thereby validating
  5. | a server side SSL certificate.
  6. +-->
  7. <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
  8. p:httpClient-ref="httpClient" />
  9. <!--
  10. | This is the authentication handler declaration that every CAS deployer will need to change before deploying CAS
  11. | into production.  The default SimpleTestUsernamePasswordAuthenticationHandler authenticates UsernamePasswordCredentials
  12. | where the username equals the password.  You will need to replace this with an AuthenticationHandler that implements your
  13. | local authentication strategy.  You might accomplish this by coding a new such handler and declaring
  14. | edu.someschool.its.cas.MySpecialHandler here, or you might use one of the handlers provided in the adaptors modules.
  15. +-->
  16. <!-- <bean
  17. class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->
  18. <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  19. <property name="sql" value="select password from userTable where userName=?" />
  20. <property name="passwordEncoder" ref="passwordEncoder"/>
  21. <property name="dataSource" ref="dataSource" />
  22. </bean>
  23. </list>
  24. </property>

密码加密方法我这里使用MD5, 配置passwordEncoder的bean

[html] view plain copy

  1. <bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
  2. <constructor-arg value="MD5"/>
  3. </bean>

在配置一个名称为dataSource的数据源

[html] view plain copy

  1. <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
  2. <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
  3. <property name="driverUrl" value="jdbc:sqlserver://localhost:1433;databaseName=testDB;"></property>
  4. <property name="user" value="sa"></property>
  5. <property name="password" value="123456"></property>
  6. <property name="maximumConnectionCount" value="100"></property>
  7. <property name="minimumConnectionCount" value="1"></property>
  8. </bean>

数据源的配置根据自己的实际情况来配置, 需要的jar如果lib下面没有,自己复制进去, 不然数据源连不上报错。

4. 现在服务端就配置好了, 如果需要定制登录/登出页面的话(实际项目基本上都需要修改), 修改cas\WEB-INF\view\jsp\default\ui\下面的casLoginView.jsp和casLogoutView.jsp就可以了

第二步 客户端web应用程序集成CAS

1. 从官网下载CAS Client, 将客户端的jar,如cas-client-core-3.2.1.jar引入到web应用程序的classpath中

2 .配置web.xml文件, 主要是添加过滤器拦截通信, 下面的实例代码, 假设web应用程序的端口是8080

[html] view plain copy

  1. <!-- CAS 单点登录(SSO) 过滤器配置 (start) -->
  2. <!-- 该过滤器用于实现单点登出功能。-->
  3. <filter>
  4. <filter-name>CAS Single Sign Out Filter</filter-name>
  5. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>CAS Single Sign Out Filter</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>
  11. <!-- CAS: 用于单点退出 -->
  12. <listener>
  13. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  14. </listener>
  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. <!-- 下面的URL是Cas服务器的登录地址 -->
  22. <param-value>http://CAS服务端所在服务器IP:8080/cas/login</param-value>
  23. </init-param>
  24. <init-param>
  25. <param-name>serverName</param-name>
  26. <!-- 下面的URL是具体某一个应用的访问地址 -->
  27. <param-value>http://具体web应用程序所在服务器IP:8080</param-value>
  28. </init-param>
  29. </filter>
  30. <filter-mapping>
  31. <filter-name>CASFilter</filter-name>
  32. <url-pattern>/*</url-pattern>
  33. </filter-mapping>
  34. <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
  35. <filter>
  36. <filter-name>CAS Validation Filter</filter-name>
  37. <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
  38. <init-param>
  39. <param-name>casServerUrlPrefix</param-name>
  40. <!-- 下面的URL是Cas服务器的认证地址 -->
  41. <param-value>http://CAS服务端所在服务器IP:8080/cas</param-value>
  42. </init-param>
  43. <init-param>
  44. <param-name>serverName</param-name>
  45. <!-- 下面的URL是具体某一个应用的访问地址 -->
  46. <param-value>http://具体web应用程序所在服务器IP:8080</param-value>
  47. </init-param>
  48. <init-param>
  49. <param-name>renew</param-name>
  50. <param-value>false</param-value>
  51. </init-param>
  52. <init-param>
  53. <param-name>gateway</param-name>
  54. <param-value>false</param-value>
  55. </init-param>
  56. </filter>
  57. <filter-mapping>
  58. <filter-name>CAS Validation Filter</filter-name>
  59. <url-pattern>/*</url-pattern>
  60. </filter-mapping>
  61. <!--
  62. 该过滤器负责实现HttpServletRequest请求的包裹,
  63. 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
  64. -->
  65. <filter>
  66. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  67. <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  68. </filter>
  69. <filter-mapping>
  70. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  71. <url-pattern>/*</url-pattern>
  72. </filter-mapping>
  73. <!--
  74. 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
  75. 比如AssertionHolder.getAssertion().getPrincipal().getName()。
  76. -->
  77. <filter>
  78. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  79. <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  80. </filter>
  81. <filter-mapping>
  82. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  83. <url-pattern>/*</url-pattern>
  84. </filter-mapping>
  85. <!-- 自动根据单点登录的结果设置本系统的用户信息(具体某一个应用实现) -->
  86. <filter>
  87. <filter-name>CasForInvokeContextFilter</filter-name>
  88. <filter-class>com.cm.demo.filter.CasForInvokeContextFilter</filter-class>
  89. <init-param>
  90. <param-name>appId</param-name>
  91. <param-value>a5ea611bbff7474a81753697a1714fb0</param-value>
  92. </init-param>
  93. </filter>
  94. <filter-mapping>
  95. <filter-name>CasForInvokeContextFilter</filter-name>
  96. <url-pattern>/*</url-pattern>
  97. </filter-mapping>
  98. <!-- CAS 单点登录(SSO) 过滤器配置 (end) -->

4. 注意上步配置文件中,过滤器CasForInvokeContextFilter的实现是需要在具体的应用中实现的,他的目的是, CAS服务端登录验证成功后,会将登录用户的用户名携带回来, 这时客户端web应用程序需要根据用户名从数据库用户表中查询到用户的Id等信息, 并填充到Session中, 这样,客户端应用程序原来的验证逻辑就不会出问题了, 因为我们一般都是通过验证session中是否含有当前登录的用户的ID来进行登录验证的。

下面是CasForInvokeContextFilter的一个简单实现。

[java] view plain copy

  1. /**
  2. * 该过滤器用户从CAS认证服务器中获取登录用户用户名,并填充必要的Session.
  3. * @author jiarong_cheng
  4. * @created 2012-7-12
  5. */
  6. public class CasForInvokeContextFilter implements Filter {
  7. @Override
  8. public void destroy() {
  9. }
  10. @Override
  11. public void doFilter(ServletRequest request, ServletResponse response,
  12. FilterChain chain) throws IOException, ServletException {
  13. HttpSession session = ((HttpServletRequest) request).getSession();
  14. //如果session中没有用户信息,则填充用户信息
  15. if (session.getAttribute("j_userId") == null) {
  16. //从Cas服务器获取登录账户的用户名
  17. Assertion assertion = AssertionHolder.getAssertion();
  18. String userName = assertion.getPrincipal().getName();
  19. try {
  20. //根据单点登录的账户的用户名,从数据库用户表查找用户信息, 填充到session中
  21. User user = UserDao.getUserByName(userName);
  22. session.setAttribute("username", userName);
  23. session.setAttribute("userId", user.getId());
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. chain.doFilter(request, response);
  29. }
  30. @Override
  31. public void init(FilterConfig config) throws ServletException {
  32. }
  33. }

到此,就完成了, 当你访问具体应用的网址, 如http://具体应用IP: 8080/ ,就会跳转到CAS服务器的登陆页面: http://CAS服务器IP: 8080/  进行登录验证, 验证通过后, 又会跳转回应用的网址。

第三步 单点登出

这个比较简单, 只要在系统的登出事件中, 将URL访问地址指向CAS服务登出的servlet, 就可以了。

http://CAS服务器IP:8080/cas/logout

时间: 2024-10-25 08:02:44

java单点登录系统CAS的简单使用的相关文章

开源单点登录系统CAS入门

1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决. 1.2 什么是CAS CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种

单点登录系统CAS入门

一.单点登录的概念 单点登录(Single Sign On),简称为SSO.SSO是定义在多个应用系统中,用户只需要登录一次就可以访问所有的相互信任的应用系统. 当我们创建工程的子系统部署在不同的服务中的时候,使用传统的session是无法解决问题的,这时候我们就需要使用相关的单点登录技术来解决. 1.CAS概述 CAS是Yale大学的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.CAS具有以下特点: 开源的企业级单点登录解决方案 CAS Server为需要独立部署的Web应用

单点登录系统cas资料汇总

http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com                            demo https://wiki.jasig.org/display/CASUM/Home                                 4.x之前的文档 http://jasig.github.io/cas/4.1.x/index.html   

【Tech】单点登录系统CAS搭建及实现用户名密码由MYSQL数据库验证

1.安装JDK 2.搭建TOMCAT: 下载tomcat7.0 双击%TOMCAT_PATH%/bin/startup.bat启动tomcat 浏览器打开http://localhost:8080,若显示如下界面,则配置成功: 3.配置tomcat使用https协议 (1)生成安全证书 cd到%JAVA_HOME%/bin/目录下,执行一下命令 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore &

CAS单点登录系统入门--分布式登录验证

1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. AutoIt 代填工具 我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决. 1.2 什么是CAS CAS 是 Yale 大学发起的一个开源项目,旨在为

单点登录系统(SSO)之CAS(中央认证服务)

SSO(Single Sign On)单点登录系统,是在多个系统中值要求只要登录一次,就可以用已登录的身份访问多个系统,去掉了每次访问不同的系统都要重新登录的弊端. CAS(中央/集中认证服务):The Central Authentication Service project, more commonly referred to as CAS is an authentication system originally created by Yale University to provid

Mvc4单点登录之一Cas简单介绍

背景 前几天写过一篇博客Net单点登录详解 (SSO),但是在这篇博客中是在asp.net 下做的实验,没有什么问题,但是转换到mvc中之后,问题就接二连三的出,后来没有办法,想想还是用人家已经写好的吧,别用那些自己写的东西了,一是不稳定,二是有很多的缺陷!然后就开始寻找!最后决定用cas来做! SSO介绍 SSO英文全称SingleSign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS = CentralAuthentication S

单点登录之CAS简单介绍

cas官网http://www.ja-sig.org/products/cas/. ok,现在开始本文的重点内容讲解,先来了解一下cas 实现single sign out的原理,如图所示: 图一 图二 第一张图演示了单点登陆的工作原理. 第二张图演示了单点登出的工作原理. 从第一张图中,当一个web浏览器登录到应用服务器时,应用服务器(application)会检测用户的session,如果没有session,则应用服务器会把url跳转到CASserver上,要求用户登录,用户登录成功后,CA

Jeesite单点登录集成cas另加自定义登录验证

Jeesite单点登录集成Cas另加自定义登录验证 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. Cas主要是用来解决多应用之间统一登陆认证,无需用户在同一公司多应用之间重复登陆.例如阿里巴巴中淘宝.天猫,在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. Cas基础 服务端 服务端cas-server-webapp-4.0.0.war,服务器端程序一般不用我们完成,但需要做一点小小的修改,cas的服务