CAS认证demo示例

java版实现

.net版实现

php版实现

一、java版实现

1、RG-SourceID说明:

接入前请确保已在SourceID中开通相关应用及权限(登录、登出、获取用户权限)

2、环境要求

JDK >=1.6

开发语言:JAVA

3、CAS验证原理说明

img

1-2、用户第一次请求时,CAS客户端拦截请求并重定向到CAS服务端(SourceID)。

3-4、(用户输入密码,服务器校验)CAS服务端生成cookie写入浏览器,同时缓存到服务器本地,并且生成ticket保存到服务器,也会加在url后面重定向会CAS客户端。

5、CAS客户端拿到ticket之后通过调用服务端的serviceValidate接口校验ticket的合法性。

6、返回用户信息。

4、对接步骤(spring版本):

可以参考cas-demo-spring

4.1、引入cas客户端的支持

在pom.xml文件引入依赖

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.5.0</version>
</dependency>

4.2、web.xml文件

注意:只需将下方的https://sid.rghall.com.cn和http://ip:port根据实际做修改即可

<?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">


<!-- ========================单点登录开始 ======================== -->
<!--  登出过滤器:SingleSignOutFilter需要配置在所有Filter之前,当Cas Client通过Cas Server登录成功,Cas Server会携带生成的Service Ticket回调Cas Client,此时SingleSignOutFilter会将Service Ticket与当前的Session绑定在一起。当Cas Server在进行logout后回调Cas Client应用时也会携带该Service Ticket,此时Cas Client配置的SingleSignOutFilter将会使对应的Session失效,进而达到登出的目的。 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
<!-- ===== 此处的https://sid.rghall.com.cn需修改 !!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!!!!!!!!!! -->
            <param-value>https://sid.rghall.com.cn</param-value>
        </init-param>
</filter>

<!-- 登出监听器:SingleSignOutHttpSessionListener用于在Cas Client应用中的Session过期时将其从对应的映射关系中移除。 -->
    <listener>    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

<!-- 登录过滤器:当访问系统受保护的资源时,cas的过滤器AuthenticationFilter会对它进行拦截,发现用户没有登录(系统中没有对应的session信息),就会跳转到统一登录页面。否则调用FilterChain中下一个Filter。 -->
    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <!-- 使用的CAS-Server的登录地址,一定是到登录的action -->
<!-- ===== 此处的https://sid.rghall.com.cn/login需修改 !!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!!!!!!!!!! -->
            <param-value>https://sid.rghall.com.cn/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <!-- 当前Client系统的地址 -->
<!-- ===== 此处的http://ip:port需修改 !!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!!!!!!!!!! -->
            <param-value>http://ip:port</param-value>
        </init-param>
    </filter>

<!-- 该过滤器负责对Ticket的校验工作 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <!--开启Saml校验类型,只需将下面注释去掉就行-->
    <!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
        <!--开启CAS2校验类型,只需将下面注释去掉就行-->
<!--<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>-->
        <!--开启CAS3-->
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <!-- 使用的CAS-Server的地址,一定是在浏览器输入该地址能正常打开CAS-Server的根地址 -->
<!-- ===== 此处的https://sid.rghall.com.cn需修改 !!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!!!!!!!!!! -->
            <param-value>https://sid.rghall.com.cn</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <!-- 当前Client系统的地址 -->
<!-- ===== 此处的http://ip:port需修改 !!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!!!!!!!!!! -->
            <param-value>http://ip:port</param-value>
        </init-param>
    </filter>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>

<!-- 将Assertion绑定到ThreadLocal。该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder
来获取用户的登录名。比如AssertionHolder.getAssertion().getPrincipal().getName()
或者request.getUserPrincipal().getName()-->
    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<!—CAS单点配置结束-->

    <!-- 配置springmvc的监听器 -->
    <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 设置spring 的配置信息 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring.xml</param-value>
</context-param>

    <!--指定请求或者响应的编码格式-->
    <filter>
        <filter-name>SetCharacterEncoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SetCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置springmvc -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <description>spring mvc 配置文件</description>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!--以下为各个过滤器的映射地址-->
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

4.3、登录

先通过获取AttributePrincipal对象,然后获取服务端返回的参数集合以及登录名。

 //登录接口
    @RequestMapping("login")
    @ResponseBody
    public String test1(HttpServletRequest request, HttpServletResponse response){

        //从请求域中获取AttributePrincipal对象
        AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();$\color{red}{红色字}$

        //获取服务端传递过来的参数
        Map<String, Object> attributes = principal.getAttributes();
        if(attributes !=null && attributes.size() >0){
            Set<Map.Entry<String, Object>> entries = attributes.entrySet();
            entries.forEach(item ->{
                System.out.println(item.getKey() + "-----" + item.getValue());
            });
            System.out.println("--------------");
        }

        //获取登录用户名
        //String loginName1 = request.getRemoteUser();
        String loginName1 = principal.getName();

        //获取Cas服务端返回的自定义数据 
        Object IDCARD = attributes.get("IDCARD");
        Object XB = attributes.get("XB");
        Object XM = attributes.get("XM");
        Object TEL = attributes.get("TEL");
        StringBuilder builder = new StringBuilder();
        builder.append("身份证:").append(IDCARD)
                .append("性别:").append(XB)
                .append("姓名:").append(XM)
                .append("电话:").append(TEL)
                .append("登录名:").append(loginName1);

        return "login success ---->" + builder.toString();
    }

获取CAS服务端返回参数:登录成功之后可以通过request域中获取CAS服务端返回的参数

//获取Cas服务端返回的自定义数据 
        Object IDCARD = attributes.get("IDCARD");
        Object XB = attributes.get("XB");
        Object XM = attributes.get("XM");
        Object TEL = attributes.get("TEL");

4.4、登出

登出操作:先将session置为无效,然后重定向到CAS服务端的登出地址,当CAS服务端登出成功之后回调service后面的地址。

    //登出接口
    @RequestMapping("logout")
    public String logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();

        //将session置为无效
        session.invalidate();

        //重定向到CAS服务端,退出成功之后CAS服务端重定向到service后面的地址,不写service的值,则默认跳转到CAS服务端指定的页面
        return "redirect:"+"https://sso.rghall.com.cn/logout"+"?service=" + "http://ip:port" + "/login";
    }

4.5、测试

在浏览器上输入:http://ip:port/login

img

输入账号密码即可跳转到下面页面

img

登录成功之后,可以查看打印的参数日志

img

登出,在浏览器上输入: http://ip:port/logout之后,又跳转到登录页面

img

5、注意事项

5.1、cas2.0和cas3.0的配置

启动cas2.0:在web.xml指定CAS Validation Filter过滤器为

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

启动cas3.0:在web.xml中指定CAS Validation Filter过滤器为

org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter

单域名部署需要将单点登录地址从 https://sso.xxx.edu.cn/login 修改为 https://sso.xxx.edu.cn/cas才可以正常对接成功

cas对接springboot版本 需要配置客户端地址: 如 cas.client-host-url=http://xxx.xxx.xxx

6、附件

java-cas-demo

二、.net版实现

1、RG-SourceID说明:

接入前请确保已在SourceID中开通相关应用及权限(登录、登出、获取用户权限)

2、环境要求

开发集成环境:VS2012 .NET4.5及以上版本

开发语言:C#

3、CAS验证原理说明

img

1-2、用户第一次请求时,CAS客户端拦截请求并重定向到CAS服务端(SourceID)。

3-4、(用户输入密码,服务器校验)CAS服务端生成cookie写入浏览器,同时缓存到服务器本地,并且生成ticket保存到服务器,也会加在url后面重定向会CAS客户端。

5、CAS客户端拿到ticket之后通过调用服务端的serviceValidate接口校验ticket的合法性。

6、返回用户信息。

4、对接步骤(net版本):

可以参考net-cas-demo

4.1、引入cas客户端的支持,添加dll引用

img

4.2、web.config文件

<?xml version="1.0"?>
<!--站点配置文件信息,配置信息都按照如下即可,都是必填项,尽量不要少配置信息-->
<configuration>
  <!--DotNet版本的cas客户端配置节点文件信息,标准化处理即可-->
  <configSections>
    <section name="casClientConfig" type="DotNetCasClient.Configuration.CasClientConfiguration, DotNetCasClient"/>
  </configSections>
  <!--具体的casClient配置信息,如:casServerLoginUrl为cas服务器登录页面地址   casServerUrlPrefix服务器前缀地址  serverName当前应用地址    notAuthorizedUrl 未验证页面  cookiesRequiredUrl未获取cookie提示页面-->
  <!--redirectAfterValidation  验证后是否重定向   gateway 网关  renew 重建  singleSignOut 单向登出   ticketTimeTolerance 超时时间   ticketValidatorName cas名称 proxyTicketManager  代理器 serviceTicketManager  代理缓存服务  gatewayStatusCookieName 代理网关状态,都保持默认,不变即可 -->
  <casClientConfig
      casServerLoginUrl="http://sid.rghall.com.cn/login"   //对应服务器地址CAS登录表单的URL
      casServerUrlPrefix=" http://sid.rghall.com.cn/p3"  //对应服务器地址前缀指向CAS服务器应用程序根目录的URL
特别注意:目前net只支持开通cas3.0的才能获取用户信息相关的attributes字段,所以在web.config文件里配置要配置/p3,在配置url中指的是开通cas3.0对接。
      serverName=http://localhost:3273   //应用地址
      notAuthorizedUrl="~/NotAuthorized.aspx"//未验证页面
      cookiesRequiredUrl="~/CookiesRequired.aspx"// cookiesRequiredUrl未获取cookie提示页面
      redirectAfterValidation="true"//验证后是否重定向
      gateway="false"//网关启用CAS网关功能
      renew="false"//重建没有
|“续订”强制用户在访问此应用程序之前重新验证CAS
      singleSignOut="true"//单向登出配置允许此应用程序在用户的SSO会话结束时接收发送的CAS single signout消息。这将导致此应用程序中的用户会话被销毁
      ticketTimeTolerance="5000"  ///超时时间
      ticketValidatorName="Cas20"//名称使用特定协议验证CAS票证的票证验证程序的名称。有效值为“Cas10、Cas20 Cas30和Saml11”
      proxyTicketManager="CacheProxyTicketManager"///代理器 serviceTicketManager
      serviceTicketManager="CacheServiceTicketManager"//代理缓存服务
      gatewayStatusCookieName="CasGatewayStatus" />//代理网关状态,都保持默认,不变即可


  <system.web>
    <!--Asp.NET MVC用System.Web自带方法写入FormsAuthentication验证-->
    <authentication mode="Forms">
      <!--详细信息为cas地址   页面   使用cookie 超时时间-->
      <forms
          loginUrl="http://sid.rghall.com.cn/login"
          timeout="90"
          defaultUrl="~/Default.aspx"
          cookieless="UseCookies"
          slidingExpiration="true"
               />
    </authentication>

    <compilation debug="true">
    </compilation>
    <!-- IIS7.0经典模式或者IIS之前版本 -->
    <httpModules>
      <add name="DotNetCasClient" type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
    </httpModules>   
  </system.web>
  <!--Asp.NET MVC用System.Web自带方法写入FormsAuthentication验证-->
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <remove name="DotNetCasClient"/>
      <add name="DotNetCasClient" type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>
    </modules>
  </system.webServer>

</configuration>

配置如下:

img

4.3、登录

右键选择Default.aspx,“在浏览器中运行”,会显示如下页面,点击“测试CAS登录”,然后页面会跳转到CAS服务认证中心登录页面,

img

img

输入用户名和密码,进行CAS单点登录,代码实现如下:点击按钮,页面会进行跳转

        //登录时通过配置的Forms认证,读取cas服务器的证书服务,是否写入了cookie,读取cookie信息
        HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (ticketCookie != null)//如果cookie不为空
        {
            if (!string.IsNullOrEmpty(ticketCookie.Value))   //如果有值
            {
// FormsAuthenticationTicket基于forms的验证
构建基于forms的验证机制过程如下:
 1,设置IIS为可匿名访问和asp.net web.config中设置为form验证
 2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用)
 3,使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储
  角色到票据中,如:
  FormsAuthentication.SetAuthCookie(Username,true | false)
  cookies保存时间:
  HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1)
 

                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);//     //将加密后的票据保存为cookie 
                if (CasAuthentication.ServiceTicketManager != null)
                {
                    CasAuthenticationTicket casTicket = CasAuthentication.ServiceTicketManager.GetTicket(ticket.UserData);
                    if (casTicket != null)
                    {
                        //从cookie中读取姓名和角色等信息
                        CasNetId.Text = casTicket.NetId;
                        CasServiceTicket.Text = casTicket.ServiceTicket;
                        CasOriginatingServiceName.Text = casTicket.OriginatingServiceName;
                        CasClientHostAddress.Text = casTicket.ClientHostAddress;
                        CasValidFromDate.Text = casTicket.ValidFromDate.ToString();
                        CasValidUntilDate.Text = casTicket.ValidUntilDate.ToString();
                    }
                }
            }
        }

登录成功:会返回到本地应用页面,然后携带相应的ticket证书信息

img

4.4、获取返回参数

之前发现通过该方法,测试了很多版本均无法取到用户信息,原因在于.NET cas2.0不支持获取,官方的casClient的源码是有坑的,主要原因是java实现的attributes的属性,.net在解析的时候,是不能自动感知attributes属性字段,需要修改代码来实现对属性字段的解析,具体如下,改造两个地方:

1. 改造第一部分,文件具体位置如下:

cas-demo\DotNetCasClient\Validation\Schema\Cas20\AuthenticationSuccess.cs

img

具体更改如下图:该文件需要增加对要解析的字段进行attributes的字段进行承接。目前我们增加了GH属性,这样在认证后,就可以直接获取GH属性。如果需要解析其他属性,则对应的在文件中添加其他属性字段的解析定义.

img

2. 改造第二部分,就是在Ticket解析中,增加对获取信息的解析。改造文件位置: cas-demo\DotNetCasClient\Validation\TicketValidator\Cas20ServiceTicketValidator.cs

从131行以后,增加对用户的属性字段解析,然后增加如下解析信息:

img

这个时候回到default页面,就可以通 httpcontext.current.user获取用户信息了:

var user = HttpContext.Current.User;

var casPrincipal = (ICasPrincipal)user;

var dict= casPrincipal.Assertion.Attributes;

从而得到用户信息,获取任何其他信息都通过此种方法,直接增加即可。

4.5、登出

登出操作:先将session置为无效,然后重定向到CAS服务端的登出地址,当CAS服务端登出成功之后回调service后面的地址。具体方法:访问地址http://localhost:3273/ExampleWebSite/Loginout.aspx

    //循环调用Cookie集合,如果找到相应的cas存储加密值,清除
for (int i = 0; i < Request.Cookies.Count; i++)
        {
            if (Request.Cookies[i].Name == ".ASPXAUTH")
            {
                Request.Cookies[i].Expires = DateTime.Now.AddDays(-1);
                Request.Cookies.Remove(".ASPXAUTH");
            }
        }
//清除cookie后,重定向到cas地址进行认证,获取相关认证信息       Response.Redirect("http://120.79.32.25:8050/cas/login?service=http://localhost:3273/ExampleWebSite/Default.aspx");

4.6、测试

在浏览器上输入:http://ip:port/Default.aspx 本地应用主页面,点击“测试CAS登录”

img

img

输入账号密码即可跳转到下面页面

img

登录成功之后,页显示了获取成功之后的参数

img

登出,在浏览器上输入:http://localhost:3273/ExampleWebSite/Loginout.aspx之后,又跳转到登录页面

img

5、注意事项

5.1、cas2.0和cas3.0的配置

启动cas2.0:下载casClient dotnet版本源码即可

启动cas3.0:需要对casClient dotnet版本源码进行改造

备注:在程序中提供相关的dll,直接支持cas2.0和cas3.0版本,但是必须在配置文件中配置,指明当前是哪个版本:即对应如下:

cas2.0:casServerUrlPrefix="https://sid.rghall.com.cn"

cas3.0:casServerUrlPrefix="https://sid.rghall.com.cn/p3"

6、附件

.net-cas-demo

三、php版实现

1、RG-SourceID说明:

接入前请确保已在SourceID中开通相关应用及权限(登录、登出、获取用户权限)

2、环境要求

开发语言:PHP

PHP版本 >= 5.4(支持curl,openssl,dom,zlib,gettext,imap,kerberos,mysql)

3、CAS验证原理说明

img

1-2、用户第一次请求时,CAS客户端拦截请求并重定向到CAS服务端(SourceID)。

3-4、(用户输入密码,服务器校验)CAS服务端生成cookie写入浏览器,同时缓存到服务器本地,并且生成ticket保存到服务器,也会加在url后面重定向会CAS客户端。

5、CAS客户端拿到ticket之后通过调用服务端的serviceValidate接口校验ticket的合法性。

6、返回用户信息。

4、对接步骤:

可以参考php demo

4.1、将PHP客户端引入应用项目

方式一:composer安装CAS客户端

1:使用PHP管理依赖(dependency)关系的工具安装CAS客户端(如未安装composer,请参考网站:https://www.phpcomposer.com 进行安装)

2:打开应用项目根目录,执行安装PHPCAS客户端命令:composer require jasig/phpcas

img

方式二:直接下载demo

1:下载demo.rar文件,解压目录,并将demo/vendor 目录拷贝到应用程序根目录

img

4.2、登录(参考demo/login.php)

第一步:新建登录PHP文件或方法

<?php
/**
 * 引用CAS客户端类(注:请根据您的应用程序框架选择正确的引用方式)
 */
require_once dirname(__FILE__).'/vendor/jasig/phpcas/source/CAS.php';
/**
 * CAS服务端配置
 */
//CAS服务端连接地址(注:根据SourceID平台提供的地址修改,需要修改)
$cas_host = 'sid.rghall.com.cn';
//CAS服务端连接路径
$cas_context = '';(注:根据SourceID平台提供的路径修改(例如:服务端登录地址为https://域名/cas,路径就为cas),默认为空)
//CAS服务端连接端口
$cas_port = 443;  (注:根据SourceID平台提供的端口修改,需要修改)
/**
 * 连接远程CAS客户端(支持协议CAS2.0,CAS3.0)
 */
//开启调试模式(false为关闭)
phpCAS::setDebug();
//CAS2.0连接服务端CAS
//phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
//CAS3.0连接服务端CAS(建议使用)
phpCAS::client(CAS_VERSION_3_0, $cas_host, $cas_port, $cas_context);
/**
 * 不对CAS服务器设置SSL验证,正式环境建议注释
 */
phpCAS::setNoCasServerValidation();
/**
 * 如果用户还没有登录,则调用此方法以强制进行身份验证
 * 校验Ticket合法性
 */
phpCAS::forceAuthentication();
/**
 * 检查用户是否登录
 */
if(phpCAS::checkAuthentication()){
    //获取登陆的用户名
    $username = phpCAS::getUser();
    //CAS客户端传来的部分参数
    //$single_info = phpCAS::getAttribute('key');

    //CAS客户端传来的全部参数
    $all_info = phpCAS::getAttributes();
    //处理应用程序对应的业务逻辑
    setcookie('username',$username);
    //打印用户信息
    $all_info['username'] = '登录用户'.$username;
    echo json_encode($all_info);
}

4.3、登出(参考demo/login.php)

<?php
/**
 * 引用CAS客户端类(注:请根据您的应用程序框架选择正确的引用方式)
 */
require_once dirname(__FILE__).'/vendor/jasig/phpcas/source/CAS.php';
**
 * CAS服务端配置
 */
//CAS服务端连接地址(注:根据SourceID平台提供的地址修改,需要修改)
$cas_host = 'sid.rghall.com.cn';
//CAS服务端连接路径
$cas_context = '';(注:根据SourceID平台提供的路径修改(例如:服务端登录地址为https://域名/cas,路径就为cas),默认为空)
//CAS服务端连接端口
$cas_port = 443;  (注:根据SourceID平台提供的端口修改,需要修改)
/**
 * 连接远程CAS客户端(支持协议CAS2.0,CAS3.0)
 */
//开启调试模式(false为关闭)
phpCAS::setDebug();
//CAS2.0连接服务端CAS
//phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
//CAS3.0连接服务端CAS(建议使用)
phpCAS::client(CAS_VERSION_3_0, $cas_host, $cas_port, $cas_context);
/**
 * 通知CAS服务器登出
 */
//跳转到CAS服务器端退出页面
phpCAS::logout();
//登出后跳转到指定的url
//phpCAS::logoutWithRedirectService($_SERVER['HTTP_HOST']);

4.4、测试

以demo为例:

1,将demo整个目录作为根目录放入php web环境中,运行php环境

2,网站访问 http://域名/login.php,如果跳转到如下图所示,说明你已成功实现登录连接了

img

3,使用SourceID提供的身份验证账号与密码进行登录,登录跳转到下图所示,说明你已完成登录测试,并获取了用户数据

img

4,登出,在浏览器上输入: http://域名/login.php之后,又跳转到登录页面(至此测试完毕)

img

5、附件

php-cas-demo

©2020 锐捷网络股份有限公司 all right reserved,powered by Gitbook该文章修订时间: 2025-02-18 14:26:08

results matching ""

    No results matching ""