`
zxs19861202
  • 浏览: 914719 次
  • 性别: Icon_minigender_1
  • 来自: 湖北—》上海
社区版块
存档分类
最新评论

cas实现单点登录,登出(java和php客户端)

阅读更多

   最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php是discuz+supesite+ucenter,需

 

要这几个客户端都要能单点登录和登出,在网上找了许多相关资料,今天终于配置成功,步骤如下:

 

1、cas服务端:下载地址:http://downloads.jasig.org/cas/cas的服务端和客户端有许多版本,最新版本和老版本

 

有很大的区别,目前服务端最新版本为:cas-server-3.4.4-release.zip

 

解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.war复制到

 

tomcat的webapps下,启动tomcat,访问:http://localhost:8080/cas/login 就可以看到登录界面了:


cas服务端默认采用的是 用户名=密码的验证,并且采用的是https验证,需要给tomact配置证书,本系统没有采用https验证,若采用https验证可参考:

 

http://blog.csdn.net/haydenwang8287/archive/2010/07/26/5765941.aspx

 

1.1、若不采用https验证,服务器端需要配置

1、cas\WEB-INF\deployerConfigContext.xml

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>

 

 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:

 

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
 p:httpClient-ref="httpClient"  p:requireSecure="false"/>

 

2、cas\WEB-INF\spring-configuration\

ticketGrantingTicketCookieGenerator.xml

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"

      p:cookieSecure="true"

      p:cookieMaxAge="-1"

      p:cookieName="CASTGC"

      p:cookiePath="/cas" />

 

参数p:cookieSecure="true",同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。

参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。

 

1.2、服务器端退出访问:http://localhost:8080/cas/logout,

 

 

若希望退出后能返回则需要配置

服务端cas-servlet.xml配置

<bean id="logoutController" class="org.jasig.cas.web.LogoutController" ... .../>

增加属性 p:followServiceRedirects="true"

 

退出链接为:http://localhost:8080/cas/logout?service=http://localhost:8080/Casclient/index.jsp

 

1.3、更改服务器端验证方式,采用数据库验证:

修改配置文件deployerConfigContext.xml,加dbcp连接池:(以oracle为例)

 

<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
     <property name="driverClassName">
          <value>oracle.jdbc.driver.OracleDriver</value>
     </property>
     <property name="url">
          <value>jdbc:oracle:thin:@192.168.18.26:1521:orcl</value>
     </property>
     <property name="username">
          <value>test</value>
     </property>
     <property name="password">
          <value>test</value>
     </property>
   </bean>

 

需要的jar包有:(见附件:cas-server-support-jdbc-3.4.4.jar,commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,ojdbc14_g.jar)

 

配置加密方式,cas内置的有MD5加密,也可以写自己的加密类,实现org.jasig.cas.authentication.handler.PasswordEncoder接口即可:

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

 

注释掉默认的验证方式,采用数据库查询验证:

<property name="authenticationHandlers">
     <list>
     <!----注释掉这里的默认验证方式,采用以下验证QueryDatabaseAuthenticationHandler-->
    <!--
    <bean
     class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->

 

     <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
      <property name="dataSource" ref="casDataSource" />
      <property name="sql"
         value="select password from userinfo where lower(username) = lower(?)" />
      <property  name="passwordEncoder"  ref="passwordEncoder"/>
     </bean>
   </list>
  </property>

 

---------------到这里cas服务端的配置就完成了。

 

 

2、java客户端配置,下载客户端:http://downloads.jasig.org/cas-clients/,目前最新版本为:cas-client-3.2.0

 

将modules下的jar复制到java客户端Casclient1的lib下,在web.xml中配置过滤器,配置如下(详情见附件):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="
http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 
 <!-- 用于单点退出,该过滤器用于实现单点登出功能,通知其他应用单点登出-->

 <listener>
         <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
 </listener>

 <!-- 该过滤器用于实现单点登出功能,可选配置。 -->

 <filter>
         <filter-name>CAS Single Sign Out Filter</filter-name>
         <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
 </filter>
 <filter-mapping>
         <filter-name>CAS Single Sign Out Filter</filter-name>
         <url-pattern>/*</url-pattern>
 </filter-mapping>

 
 <!-- 该过滤器负责用户的认证工作,必须启用它 -->
 <filter>
         <filter-name>CASFilter</filter-name>
         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
         <init-param>
                 <param-name>casServerLoginUrl</param-name>
                 <param-value>http://192.168.18.8:8080/cas/login</param-value>
                 <!--这里的server是服务端的IP-->
         </init-param>
         <init-param>
                 <param-name>serverName</param-name>
                 <param-value>http://192.168.18.8:8989</param-value>
         </init-param>
 </filter>
 <filter-mapping>
         <filter-name>CASFilter</filter-name>
         <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
 <filter>
         <filter-name>CAS Validation Filter</filter-name>
         <filter-class>
                 org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
         <init-param>
                 <param-name>casServerUrlPrefix</param-name>
                 <param-value>http://192.168.18.8:8080/cas</param-value>
         </init-param>
         <init-param>
                 <param-name>serverName</param-name>
                 <param-value>http://192.168.18.8:8989</param-value>
         </init-param>
 </filter>
 <filter-mapping>
         <filter-name>CAS Validation Filter</filter-name>
         <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 <!--
         该过滤器负责实现HttpServletRequest请求的包裹,
         比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
 -->
 <filter>
         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
         <filter-class>
                 org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
 </filter>
 <filter-mapping>
         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
         <url-pattern>/*</url-pattern>
 </filter-mapping>

<filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
 
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

页面为:

<%
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();   
String username = principal.getName();
%>
<br/>----------------------------------------------------------<br/>
<h1>登录成功,这是客户端1啊</h1><br/>
用户名:<%=username %><br/>
<a href="http://localhost:8989/Casclient2/index.jsp">进入客户端2</a><br/>

<a href="http://localhost:8080/cas/logout?service=http://localhost:8989/Casclient1/index.jsp">退出</a><br/>

 

-----------到这里java客户端配置成功,发布到tomcat,复制Casclient1改名为Casclient2,启动tomcat,

 

访问Casclient1,跳转到登录页面,登录成功后成功转向登录成功页面,这时访问Casclient2发现不需要登录即显示登录成功页面,java单点登录成功。

 

 

3、配置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

 

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

<?php

//
// phpCAS simple client
//

// import phpCAS lib
include_once('CAS.php');

phpCAS::setDebug();

// initialize phpCAS
phpCAS::client(CAS_VERSION_2_0,'192.168.18.8',8080,'cas');

// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();

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

// at this step, the user has been authenticated by the CAS server
// and the user's login name can be read with phpCAS::getUser().

// logout if desired
if (isset($_REQUEST['logout'])) {

 

 $param=array("service"=>"http://localhost/Phpcasclient1/example_simple.php");//退出登录后返回

 phpCAS::logout($param);


}

// for this test, simply print that the authentication was successfull
?>
<html>
  <head>
    <title>phpCAS simple client</title>
  </head>
  <body>
    <h1>Successfull Authentication!这是客户端1</h1>
    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
   
  <p><a href="
http://192.168.18.8:8989/Casclient1/index.jsp">去java客户端1</a></p>
    
 <p><a href="?logout=">退出</a></p>
  </body>
</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();

 

 

至于discuz+supesite的单点登录,再了解了php单点登录的原理后就需要改造discuz+supesite的登录代码了,discuz的为logging.php

 

supersite的为batch.login.php,俺是做java开发的,对php不是很熟悉,所以改造的觉得不是很靠谱,大致是先让discuz单点登录,获取用户名,根据用户

 

获取数据库中的密码再交给discuz系统自己的登录系统登录。discuz是采用cookie验证的,所以在java端退出后,discuz不会退出。

 

若谁有改造很成功的可以交流下。

 

参考网址:

http://blog.csdn.net/DL88250/archive/2008/08/20/2799522.aspx

http://www.wsria.com/archives/1349

http://tonrenyuye.blog.163.com/blog/static/30012576200922925820471/

http://www.discuz.net/thread-1416206-1-1.html

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

  • 大小: 10.3 KB
  • 大小: 8.1 KB
  • lib.rar (1.9 MB)
  • 下载次数: 362
6
0
分享到:
评论
13 楼 miketwais 2017-08-12  
janyee2012 写道
楼主在不,请问下面这句配置在discuz没有反映,不知道怎么回事,求help
phpCAS::handleLogoutRequests();  这里会检测服务器端java退出的通知,就能实现php和java间同步登出了

本人刚整合cas+php+java,cas server端单点退出,无法将discuz退出,因为discuz是cookie保持会话,所以要另外处理,手动清一下cookie.
12 楼 卡卡欧克 2016-02-29  
php 客户端 不能和 java 客户端 同时登录 怎么办

11 楼 janyee2012 2015-01-10  
楼主在不,请问下面这句配置在discuz没有反映,不知道怎么回事,求help
phpCAS::handleLogoutRequests();  这里会检测服务器端java退出的通知,就能实现php和java间同步登出了
10 楼 janyee2012 2015-01-10  
phpCAS::handleLogoutRequests();  这里会检测服务器端java退出的通知,就能实现php和java间同步登出了
9 楼 ppt0501 2014-12-12  
楼主,你好,我遇到一个异常:Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
请问是什么原因啊?
8 楼 blacklong 2013-09-06  
好,适合新手~~
7 楼 xiaophai 2013-01-25  
绝对是好文啊,搭建好了!很是给力啊!
6 楼 ahut9923 2012-01-20  
好文章,好人。谢谢分享
5 楼 kevintanhappy 2011-10-28  
java客户端配置了web.xml,把那段红色部分的xml都拷贝进去了,求解释啊,Tomcat都启动不了了,怎么回事啊 QQ 276034602
4 楼 mominet 2011-09-06  
单点登录到java系统后,如何调用java系统中加载权限的操作呢?
3 楼 elan1986 2011-01-19  
CAS Authentication failed!

这个情况一般是因为你的证书配置有问题,就是最好开启HTTPS服务!

在不就是失效或者过期了!
2 楼 zxs19861202 2011-01-06  
报CAS Authentication failed! 应该是你没改完全

需要修改的部分其实很明显,我把建好的php客户端发上去你看下吧!
1 楼 zhang2956415 2011-01-04  
我在配置:example_simple.php后 访问这个页面时 报错:
CAS Authentication failed!
楼主 怎么办?
还有
新建php工程:Phpcasclient1,将CAS文件夹和CAS.php复制到工程中,修改CAS/client.php,将其中的https改为http

是全部都修改为 http 吗? 还是只改306行?

相关推荐

    cas单点登录登出配置demo

    cas单点登录登出配置 php 和java 版本。 完美实现了登录和登出, demo cas server 3.5.2 版本 -- 扔到tomcat下直接跑。 java客户端为 3.2.1. -- 要想跑的话需要自己下载jar php 扔到php工程里面直接跑。。 记得看...

    CAS单点登录多语言整合文档+源码

    这个压缩包文件包含的是关于CAS单点登录的多语言整合文档和源码,特别提到了PHP客户端和Java客户端的整合。 首先,我们来深入理解一下CAS的基本工作原理。当用户尝试访问受CAS保护的应用时,会被重定向到CAS服务器...

    cas客户端登陆配置文档

    本配置文档将深入探讨如何配置CAS客户端以实现自定义登录和与服务端统一登录的功能。 首先,我们需要理解CAS的基本工作流程:用户尝试访问受保护的应用,被重定向到CAS服务器进行身份验证,成功后返回一个票据...

    php+java+cas

    CAS是一种开放源码的单点登录(Single Sign-On, SSO)协议,主要用于Web应用的集中式身份验证。在这样的环境中,用户只需登录一次,就能访问所有支持CAS的系统,无需再次输入用户名和密码。 首先,让我们深入了解...

    单点登录CAS应用代码(HTTPS)

    单点登录(Single Sign-On, ...在实际操作中,可能还需要处理如票据超时、单点登出(Single Sign-Out, SSO)以及与其他身份验证系统的集成等问题。理解并掌握这些知识点,对于构建安全、高效的单点登录系统至关重要。

    cas_client.rar 客户端

    4. **单点登出**(Single Sign-Out,SSO):用户在一个服务上登出时,CAS客户端可以通知所有其他服务,实现全局登出。 5. **服务票证**(Service Ticket)和**代理票证**(Proxy Ticket):服务票证是用户访问特定...

    cas4.1.4server服务端+client端

    CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,主要功能是实现单点登录(Single Sign-On,SSO)。CAS 4.1.4 是该框架的一个版本,提供了服务端和客户端组件,使得用户在访问多个应用系统...

    单点登入--CAS3.0

    - CAS还支持单点登出功能,用户在一处登出时,其他所有受CAS保护的应用也会同步登出。 10. **CAS客户端**: - 客户端库可以简化与CAS服务器的集成,例如Java、.NET、PHP、Python等都有相应的客户端库。 综上所述...

    单点登录源码

    1. **CAS协议**:CAS协议是SSO实现的基础,它定义了客户端(如浏览器)和服务提供者如何与CAS服务器通信的流程,包括登录、验证票据、退出等操作。理解CAS协议的工作流程对开发者来说至关重要。 2. **票据(Ticket...

    Cas Server 3.4.2 和 Cas Client 3.1.6 的源代码

    3. **单点登出**:Cas Client 实现了单点登出功能,当用户在一处登出时,所有已认证的应用系统都会同步登出。 4. **适应性**:Cas Client 3.1.6 兼容多种编程语言和框架,如 Java, .NET, PHP 等,使得各种平台上的...

    sso单点登录(整理的学习文档)

    ### SSO单点登录概述与关键技术 #### 一、单点登录(Single Sign-On, SSO...其中,Session跨域、Cookie和Token是实现单点登录的关键技术。通过对这些技术的理解和运用,可以有效地提升现代互联网应用的安全性和可用性。

    统一身份认证平台集成接口文档.doc

    在 JAVA 中,也可以使用 CAS 客户端来实现登出功能。首先,需要使用 CAS 客户端 API logout 方法,然后将用户登出。 3. PHP 语言 PHP 是一种广泛使用的服务器端脚本语言,具有强大的功能和灵活性。在 PHP 中,可以...

    气象政务管理平台单点登录、统一用户、统一菜单服务、消息服务集成、新建快捷菜单管理..docx

    配置示例中,`&lt;listener&gt;` 元素用于监听用户的会话状态,确保单点登出功能的正常工作。`&lt;filter&gt;` 元素则包含了 CAS 的认证和验证过滤器,其中的 `casServerUrlPrefix` 和 `casServerLoginUrl` 参数分别指定CAS...

    springsecurity整合cas全程

    CAS (Central Authentication Service) 是一种广泛应用的单点登录框架,尤其适合 Web 应用。它提供了一个中心化的身份验证服务器,用于处理用户的登录请求,并向不同的客户端应用分发验证凭据。CAS 的设计灵活且易于...

Global site tag (gtag.js) - Google Analytics