由于多个项目需要帐号的互通,所以一开始就是用cas去做的,不得不说cas要配置的东西挺多的,但是项目安全性不需要太高,所以没有做https的请求,也就是没有弄证书,这虽然省了很多时间和精力,但是项目之间的安全性降低了不少。

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即可。
  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中配置验证方式,我这里配置数据库查询语句来实现用户名和密码的验证。

  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

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

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

  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就可以了

然后就是java客户端的配置

1. 从官网下载CAS Client, 将客户端的jar,如cas-client-core-3.2.1.jar引入到web应用程序的classpath中
2 .配置web.xml文件, 主要是添加过滤器拦截通信, 下面的实例代码, 假设web应用程序的端口是8080
  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的一个简单实现。
  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/  进行登录验证, 验证通过后, 又会跳转回应用的网址。

 
php客户端配置 下载php客户端:http://downloads.jasig.org/cas-clients/php/ ,目前最新版本为:CAS-1.2.0RC2

新建php工程:Phpcasclient1,将CAS文件夹和CAS.php复制到工程中,修改CAS/client.php,将其中的https改为http,将docs/examples/example_simple.php

复制到工程中,修改如下:

  1. <?php
  2. //
  3. // phpCAS simple client
  4. //
  5. // import phpCAS lib
  6. include_once('CAS.php');
  7. phpCAS::setDebug();
  8. // initialize phpCAS
  9. phpCAS::client(CAS_VERSION_2_0,'192.168.18.8',8080,'cas');
  10. // no SSL validation for the CAS server
  11. phpCAS::setNoCasServerValidation();
  12. // force CAS authentication
  13. phpCAS::forceAuthentication();
  14. // at this step, the user has been authenticated by the CAS server
  15. // and the user's login name can be read with phpCAS::getUser().
  16. // logout if desired
  17. if (isset($_REQUEST['logout'])) {
  18. $param=array("service"=>"http://localhost/Phpcasclient1/example_simple.php");//退出登录后返回
  19. phpCAS::logout($param);
  20. }
  21. // for this test, simply print that the authentication was successfull
  22. ?>
  1. <html>
  2. <head>
  3. <title>phpCAS simple client</title>
  4. </head>
  5. <body>
  6. <h1>Successfull Authentication!这是客户端1</h1>
  7. <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
  8. <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
  9. <p><a href="http://192.168.18.8:8989/Casclient1/index.jsp">去java客户端1</a></p>
  10. <p><a href="?logout=">退出</a></p>
  11. </body>
  12. </html>

php配置需要开启php_curl,可以复制Phpcasclient1为Phpcasclient2

访问:http://localhost/Phpcasclient1/example_simple.php,跳转到登录页面,登录成功后访问Phpcasclient2,不需要登录,

php单点登录成功,这时再访问java客户端发现也不需要登录,php和java应用之间单点登录成功。

注:php的phpCAS::client(CAS_VERSION_2_0,'192.168.18.8',8080,'cas');地址需要和java的web.xml中的cas服务器地址一致,我开始一个写的ip:192.168.18.8,一个写的localhost,

php和java总是不能同步登录,郁闷了好久

----------------到这里java和php的客户端已经配置完成,现在你会发现php和java之间不能单点登出,php端退出java客户端也退出,反之java退出但是php却没有同步退出

这里需要做一个配置,在

phpCAS::setNoCasServerValidation();

// force CAS authentication
phpCAS::forceAuthentication();

这里加上

phpCAS::setNoCasServerValidation();

// force CAS authentication

phpCAS::handleLogoutRequests();  这里会检测服务器端java退出的通知,就能实现php和java间同步登出了。

phpCAS::forceAuthentication();

在这里还有一个坑,就是假如你的php项目是用函数式的退出和登录方式,也就是按照cookie去验证的,所以在java端退出后,php端不会退出。
所以这里需要对你的验证方式进行修改,至于修改方式要根据你的项目来看。
 
附上文件
发现不知道在哪上传文件 大家有需要可以去百度 这些资源都很好找的 有抱歉之处请见谅= =

Cas服务器设置(java),java、php客户端配置的更多相关文章

  1. 单点登录CAS系列第06节之客户端配置单点登录

    原理 纯web.xml 借助Spring 注意 代码 测试 原理 这里用的是:cas-client-core-3.4.0.jar(2015-07-21发布的) 下载地址为:http://mvnrepo ...

  2. jasig CAS 实现单点登录 - java、php客户端登录实现

    jasig CAS项目本身就是一个完整的CAS单点登录服务 1.服务端需要把  认证处理类.用户属性返回值处理类 调整成我们自己处理类即可实现单点登录 2.java客户端需要引入cas-client- ...

  3. cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)

    转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...

  4. 配置Glassfish服务器、部署Java web项目、Maven安装配置及JDK版本匹配性问题

    错误一:在win7上通过命令asadmin start-domain启动Glassfish服务器时报错(如下): Exception in thread "main" java.l ...

  5. CAS服务器集群和客户端集群环境下的单点登录和单点注销解决方案

    CAS的集群环境,包括CAS的客户应用是集群环境,以及CAS服务本身是集群环境这两种情况.在集群环境下使用CAS,要解决两个问题,一是单点退出(注销)时,CAS如何将退出请求正确转发到用户sessio ...

  6. Cas服务器以及客户端搭建

    一.搭建cas服务器 官网:http://jasig.github.io/cas/ Cas Server 下载:http://developer.jasig.org/cas/ Cas Client 下 ...

  7. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  8. 【原创】LoadRunner Java Vuser脚本的配置和调试指南

    1 编写目的 本文介绍了Loadrunner多负载压力机的配置,并通过测试Java Vuser的数据库连接脚本对配置结果进行了验证,同时对配置过程中遇到的问题和解决的过程进行了记录,关于Java数据库 ...

  9. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

随机推荐

  1. AndroidStudio

    Google官方的Android集成开发环境(IDE = Integrated Development Environment),Eclipse + Adt插件的代替者. 实用设置: android ...

  2. [MySQL]命令行工具和基本操作

    [MySQL]命令行工具和基本操作 一 MySQL命令行工具  (查看帮助 ---help,或 -?) 1)MySQL MySQL是一个简单的SQL外壳(有GNU readline功能).它支持交互式 ...

  3. Beaglebone Black的启动

    Beaglebone Black的启动 第1章  准备开始 Beaglebone Black上最显眼的恐怕就是板子两侧的扩展端口,一侧有46个端口,共92个端口Beaglebone Black的启动. ...

  4. ural 1242. Werewolf

    1242. Werewolf Time limit: 1.0 secondMemory limit: 64 MB   Knife. Moonlit night. Rotten stump with a ...

  5. hadoop2.2.0部署

    hadoop2.2.0部署 下载安装包 hadoop-2.2.0-cdh5.0.0-beta-1.tar.gz 解压 tar zxvf hadoop-2.2.0-cdh5.0.0-beta-1.tar ...

  6. VS 2010 WebSite网站 使用CodeBehide 方式开发[Web应用程序项目转Web网站]

    由于生成Web应用程序的文件非常大,100M左右,上传到香港太慢,对于运维工作很不现实, 所以只能改用单个源代码文件上传方式,也就是Web网站方式,但VS2010中只提供Web网站转Web应用程序功能 ...

  7. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  8. css expression

    概述 css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作 ...

  9. ios clang: error: linker command failed with exit code 1 (use -v to see invocation)解决方法

    当xcode编译时出现这个错误,一般是你的编译源码中存在重复的源码 解决方法:"Build Phases" -> "Compile Sources" 去删 ...

  10. 手机开发必备技巧:javascript及CSS功能代码分享

    1. viewport: 也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域,这是真正有效的区域.由于移动设备屏幕宽度不同 ...