最近项目要嵌入到平台上做一个应用,数据对接用ms-security(见上篇博客),登录则使用cas认证,今天就把完整代码放进来,也是走了好些个弯路的。

代码的主要逻辑就是,当用户访问应用时,应用检测是否已登录,未登录则带上本地url跳转到cas登录中心,用户输入用户名、密码后,正确的话便带上ticket跳转到一开始带上的url(通常是该应用的登录接口),检测到ticket后便使用file_get_contents方法读取cas认证的页面,之后获取到想要的用户名,使用该用户名去该应用的用户表查找记录session并登录。

// cas服务器登录地址

$loginServer = "http://cas/sso/login";

// cas服务器验证地址

$validateServer = "http://cas/sso/serviceValidate";

// cas服务器回调地址

$address = "http://app/exam/";

// 若有回调地址,便在url里追加上

if (isset($_REQUEST["redirectUrl"]) && !empty($_REQUEST["redirectUrl"])) {

$address .= "?redirectUrl=" . $_REQUEST["redirectUrl"];

}

// 如果请求带有ticket

if (isset($_REQUEST["ticket"]) && !empty($_REQUEST["ticket"])) {

try {

// url里带上ticket去cas服务验证地址

$validateurl = $validateServer . "?ticket=" . $_REQUEST["ticket"] . "&service=" . $address;

header("Content-Type:text/html;charset=utf-8");

// 后去验证后的内容

$validateResult = str_replace('cas:', '', file_get_contents($validateurl));

$validateXML = simplexml_load_string($validateResult);

$successnode = $validateXML->authenticationSuccess[0];

// 验证成功

if (!empty($successnode)) {

// 获取用户名,并在该系统内查询用户相关的信息

$account = (string)$successnode->user;

$auth = M('Auth')->where(array('a_account' => $account))->field('a_id, s_id, a_account')->find();

// 保存session

setPassportId($auth['a_id']);

// 保存登录信息

$info['a_id'] = $auth['a_id'];

$info['a_last_login_time'] = time();

$info['a_last_login_ip'] = ip2long(get_client_ip());

$info['a_login_count'] = array('exp', 'a_login_count+1');

M('Auth')->save($info);

// 加入登陆统计表

$map = array();

$map['l_year'] = date('Y', time());

$map['l_month'] = date('m', time());

$map['a_id'] = $auth['a_id'];

$map['s_id'] = $auth['s_id'];

$l_id = M('Login')->where($map)->getField('l_id');

if ($l_id) {

$map['l_count'] = array('exp', 'l_count+1');

M('Login')->where(array('l_id' => $l_id))->save($map);

} else {

$map['l_count'] = 1;

M('Login')->add($map);

}

redirect(__APP__ . '/Index');

// 若验证失败,如ticket过期、不合法的service,则重新认证

} else {

header("Location: " . $loginServer . "?service=" . $address);

exit;

}

} catch (Exception $e) {

echo "出错了";

echo $e->getMessage();

}

// 否则就去cas登录地址

} else {

header("Location: " . $loginServer . "?service=" . $address);

exit;

}

这里遇到的一个问题是认证返回的cas相关的xml是带有命名空间的,一开始(代码中没有使用str_replace)怎么都解析不了,后来到论坛问了下,之后自己又找了下xml的相关信息,最后用str_replace去掉了命名空间(namespace)之后解析正常,于是去论坛看看有朋友解答么,打开问题后,发现两位坛主说了下看法,其中唠叨大大不愧是经验丰富的,正确给出了答案,但是最下面的那个在我机子上没有解析出来

$str = <<

zhangjian

EOT;

$validateXML = simplexml_load_string($str, null, 0, 'cas', true);

print_r($validateXML);

$successnode = $validateXML->authenticationSuccess[0];

print_r($successnode);

// 此方法还是没有解析出来

$xml = new DOMDocument();

$xml -> loadXML($str);

print_r($xml);

cas认证 php,使用php处理cas认证相关推荐

  1. CAS配置数据库,实现数据库用户认证

    CAS配置数据库,实现数据库用户认证 1.建库建表 说明:自己创建数据库,以下为建表SQL语句 DROP TABLE IF EXISTS `t_cas`; CREATE TABLE `t_cas` ( ...

  2. CAS client 登录认证 报不允许使用CAS来认证您访问的目标应用。

    CAS client 登录认证 报不允许使用CAS来认证您访问的目标应用. .. 解决方案: 修改src/main/resources/services目录下的HTTPSandIMAPS-100000 ...

  3. 华为外部Portal认证 Radius认证计费 实现基于Mac快速认证的Mac无感知认证和结合CAS单点登录统一认证平台和AD域LDAP对接配置

    华为外部Portal认证 Radius认证计费 实现基于Mac快速认证的Mac无感知认证 结合CAS单点登录统一认证平台 AD域LDAP对接配置 实现用户名密码实名认证 访客短信认证 二维码扫码 钉钉 ...

  4. springboot + springsecurity + cas学习笔记(二)—— CAS认证原理

    CAS,Central Authentication Service-中央认证服务,是Yale 大学发起的一个企业级的.开源的项目,旨在为Web应用系统提供一种可靠的SSO解决方案.下面简单介绍SSO ...

  5. cas协议,以及tomcat搭建cas服务器

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  6. cas client 更新ticket_有人知道 cas单点登录系统是怎么样取得proxyticket的?

    展开全部 CAS 原理和协议 从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client.CAS Server 需要独立部署,主要负责62616964757a686964616 ...

  7. jasig cas java示例_单点登录cas jasig学习笔记

    1 什么是单点登录 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信 ...

  8. 从cas-overlay-template安装apereo cas 6.1.x并连接CAS客户端

    一 什么是单点登录 简单点说 单点登录的英文名称为Single Sign-On,简写为SSO,它是一个用户认证的过程,允许用户一次性进行认证之后,就访问系统中不同的应用:而不需要访问每个应用时,都重新 ...

  9. CAS单点登出,调整CAS源码,实现前后端分离单点登出、清除redis、shiro登录状态

    前端点击"登出"按钮,跳转到CAS的登出. CAS默认配置了单点登出,在登出后,会向所有客户端系统发送这个用户登出的报文. 各客户端系统有责任接收并处理这个用户登出的报文,然后在注 ...

最新文章

  1. NTP时间服务器搭建
  2. Concert Tour(Uvalive 6853)
  3. set 数据类型的应用场景
  4. CSS Framework 960 Grid System (收)
  5. android添加删除项目,编写android计算器添加删除按钮,出现很抱歉,XX项目已停止运行。...
  6. 跟2G说再见?这些IoT“钉子户”表示做不到……
  7. 冒泡排序法 - python版详解
  8. 数据库事务的四个隔离级别
  9. 定位插件_谷歌官方发布了一款全新超实用Chrome插件,支持国内使用!
  10. 15-传智书城后台程序设计
  11. 通过伪协议解决 父页面与iframe页面通信的问题
  12. Android Studio 打包AAR和第三方静态库
  13. java map的key和value_Java Map集合按照key和value排序之法
  14. js for foreach 快慢_JS之 编码小技巧
  15. 用友NC安装教程、用友NC65安装教程、用友NC57安装教程、NC安装教程、NC65授权教程
  16. 【软件工程】二、需求分析——怎么提需求?,怎么写需求?
  17. citypicker城市选择+高德定位,城市编码统一设置
  18. 使用Java实现身份证真假校验
  19. c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)
  20. 一键拼接微信好友头像/玩炫朋友圈

热门文章

  1. Unity2D图片连续
  2. vue+Element+select满足条件后将选择框清空
  3. 钉钉待办事项体验报告
  4. oracle序列缓存清除,Oracle序列
  5. Android 存储空间访问方法
  6. oppo手机彩蛋android 9.0,OPPO手机安卓8.1系统彩蛋怎么打开
  7. 机智程序员,用Python俘获了女神的芳心!
  8. word2vec和one-hot
  9. 清理完计算机开机屏红,解决办法:计算机启动时如何解决红屏问题
  10. Fiddler抓包工具