cas认证 php,使用php处理cas认证[通俗易懂]

cas认证 php,使用php处理cas认证[通俗易懂]最近项目要嵌入到平台上做一个应用,数据对接用ms-security(见上篇博客),登录则使用cas认证,今天就把完整代码放进来,也是走了好些个弯路的。代码的主要逻辑就是,当用户访问应用时,应用检测是否已登录,未登录则带上本地url跳转到cas登录中心,用户输入用户名、密码后,正确的话便带上ticket跳转到一开始带上的url(通常是该应用的登录接口),检测到ticket后便使用file_get_c…

大家好,又见面了,我是你们的朋友全栈君。

最近项目要嵌入到平台上做一个应用,数据对接用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);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148010.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql 自动当前时间_Mysql 自动获取当前时间[通俗易懂]

    mysql 自动当前时间_Mysql 自动获取当前时间[通俗易懂]实现方式:1、将字段类型设为TIMESTAMP2、将默认值设为CURRENT_TIMESTAMP举例应用:1、MySQL脚本实现用例–添加CreateTime设置默认时间CURRENT_TIMESTAMPALTERTABLE`table_name`ADDCOLUMN`CreateTime`datetimeNULLDEFAULTCURRENT_TIMESTAMPC…

    2022年9月27日
    5
  • 登陆网站时验证码有什么作用

    登陆网站时验证码有什么作用没有验证码登陆,黑客会更加容易激活成功教程你的账号,通过组合码刷机等黑客技术来破取你的密码,有了验证码相当于加了一层很厚的屏障,安全系数很高。  验证码是一种区分用户是计算机和人的公共全自动程序。  验证码作用:可以防止恶意激活成功教程密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力激活成功教程方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社…

    2022年7月14日
    15
  • mysql连接远程数据库_plsql连接远程数据库

    mysql连接远程数据库_plsql连接远程数据库  新安装的MySQL只有一个root用户,默认不开启远程连接。下面以Ubuntu系统下的MySQL为例,说明如何远程连接MySQL数据库。登录root用户mysql-uroot-pyongdu查看mysql数据库中的所有表mysql>showdatabases;+——————–+|Database|+——-…

    2022年10月13日
    5
  • ue4在c盘的缓存_怎么清除ps在C盘的缓存

    ue4在c盘的缓存_怎么清除ps在C盘的缓存大家好,可能很多新手使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故。下面来告诉大家怎么解决这个问题。概述一、出现的问题:UE4的缓存文件会导致C盘膨胀!二、解决的方式:请严格按照下列步骤来执行1.更改UE4的缓存路径2.删除UE4在C盘的缓存3.删除各个引擎版本SwarmAgent(联机构建)的缓存文件…

    2022年10月5日
    3
  • winserver2003DNS服务器配置[通俗易懂]

    winserver2003DNS服务器配置[通俗易懂]目前很多企业事业单位都建立了单位内部的局域网,网络内部都配备相关的服务器(如web、ftp等服务器)。内部网络的用户都希望所有的服务器都用域名来访问,网络管理员可以采用在内部搭建DNS服务器的方式来实现。在内部网络搭建DNS服务器,让用户在其计算的“DNS服务器的IP地址”中输入内部网络DNS服务器的ip地址。在该内部网络的DNS服务器上建立正向、方向搜索区域。将没有注册互联网

    2022年6月1日
    118
  • 搜索网站

    搜索网站一、网盘搜索胖次百度网盘搜索引擎http://www.panc.cc/自称已索引13,614,209个百度网盘资源,有百度网盘失效链接解析功能,还有下载版的网盘搜索器。麦库搜索(目前功能受限制)http://www.baidu10.net/目前最好用的一个网盘搜索,引擎基于谷歌,可以搜索的网盘也很多,是较少能搜索快传和微云资源的网盘搜索引擎。同时,还有知乎搜索等独特…

    2022年7月15日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号