CAS客户端整合(四)-- Cacti
Cacti 是一套纯 lnmp 搭建的服务器监控系统,用 SNMP 抓取数据,RRDTool 绘制表格
登录流程
Cacti 的登录同样是先判断session,再尝试从 cookie 读取 session ,最后验证用户名和密码。流程图略。
整合了几个客户端,把我所理解的cas客户端认证的过程画出来:

代码修改
照例引入CasClient, 登录时
修改/include/auth.php
// 建议放在global前面,否则引发 session_start 错误
include('./cas/CasClient.php');
include('./include/global.php');
//...
/* check for remember me function ality */
// 没有session时,拒绝从cookie读取sessionid, 并发起cas认证,成功后获取用户id
if (!isset($_SESSION['sess_user_id'])) {
//$cookie_user = check_auth_cookie();
if (phpCAS::isAuthenticated()) {
$cas_user = phpCAS::getUser();
$cas_user_id = db_fetch_cell_prepared('SELECT id FROM user_auth WHERE username = ? AND realm = 0 AND enabled = "on"', array($cas_user));
$_SESSION['sess_user_id'] = $cas_user_id;
} else {
$login_url = phpCAS::getServerLoginURL();
//header ('Location: ' . $login_url);
echo '<script type="text/javascript">window.top.location.href="'. $login_url .'";</script>';
}
$cookie_user = false;
if ($cookie_user !== false) {
$_SESSION['sess_user_id'] = $cookie_user;
}
}
登出
同样是include/auth.php
if (get_current_page() == 'logout.php') {
$ref = 'http://' . $_SERVER['SERVER_NAME'] . substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/')+1) . 'index.php';
phpCAS::logoutWithRedirectService($ref);
return true;
}
关于phpCAS::$_PHPCAS_CLIENT->setNoClearTicketsFromUrl ()
之前一直没仔细看代码,以为这个是用来强制重定向到去除token的URL,后来才发现这个是关闭。瞬间开始怀疑人生。
在CasClient中调用这句之后,cas登录成功,但是URL中还携带token参数。结果就是如果F5刷新网页,会跳出认证失败的错误。
因此想当然地以为去掉这句,整个cacti的cas客户端就完结撒花了。
然而意想不到的是,结果变成了重定向死循环
Cacti 的 session_name()
打开浏览器查看 network ,页面的重定向循环是 index.php -> cas login -> index.php带token -> 去掉token的index.php -> 无会话态重新cas login -> index.php 带token -> ...(无限循环)
那么,问题必然出现在session上。因为显然cas-Client已经认证成功获取了用户名,但是初始化用户session的时候失败了,导致去除token重定向后又继续向cas发起认证。
因此对Cacti的源码搜索关键词 session ,发现一行
$cacti_session_name = 'Cacti';
session_name($cacti_session_name);
这个session_name就是存储在客户端本地cookie的session名:

我在global.php引入之前导入了casClient,初始化了用户session,session名PHPSESSID。但是global.php 初始化了Cacti的session变量Cacti,导致后期无法获取到session里的phpCAS。
因此把/include/global.php中的session_name 改回 ‘PHPSESSID’:
//$cacti_session_name = 'Cacti';
$cacti_session_name = 'PHPSESSID';
改完还是无限循环。。删除本地cookie,重启浏览器,仍然无解
继续看Cookie,又产生新的Cacti 变量。于是继续全文搜索Cacti代码查找$cacti_session_name,找到/include/config.php中还有定义。
修复完成,DONE!
logoutRequest
因为在代码中拒绝从cookie读取用户session,因此这里的logoutRequest 可以正常工作,清除session后同步登出。
在cas.log 中查看日志:

CAS客户端整合(四)-- Cacti的更多相关文章
- CAS客户端整合(二) Zabbix
Zabbix是一个强大的服务器/交换机监控应用,有zabbix-server, zabbix-client, zabbix-web 三部分.zabbix-web管理端是用php写的. 前文参考:CAS ...
- CAS客户端整合(三) Otrs
OTRS 是用Perl写的一个工单邮件系统,非常强大. 登录流程 流程图略过 otrs没有像 discuz 和 zabbix 类似的游客登录状态,这样处理起来逻辑分支少一些. 不过还是考虑用 otrs ...
- CAS客户端整合(一) Discuz!
有好几个系统需要接入CAS,所以登录模块统统需要重构 版本 CAS服务端是Java的 Cas-server-4.0 CAS的php客户端 是 phpCAS-1.2.0 论坛版本是 Discuz!X3. ...
- 品优购商城项目(六)CAS客户端与SpringSecurity集成
cas单点登录旨在解决传统登录模式session在分布式项目中共享登录信息的问题. 本文cas服务器使用 4.0版本,仅供学习参考.把 cas.war 直接部署在tomcat即可,这里有个固定的用户名 ...
- cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...
- springboot之cas客户端
一.CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源.对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 ...
- SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...
- CAS客户端与SpringSecurity集成
4. CAS客户端与SpringSecurity集成 4.1 Spring Security测试工程搭建 (1)建立Maven项目casclient_demo3 ,引入spring依赖和spring ...
- cas sso 整合记录
首先说明下,我使用的cas-server版本是4.2.1 整合过程中遇到的问题及解决方式如下 1.因为使用https的话证书是个麻烦事,所以启用http 修改cas-server-webapp下的ca ...
随机推荐
- Memcached 分布式缓存实现原理简介
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
- linux应用之yum命令的软件源的更换(centos)
[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...
- 9 python 数据类型—字典
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...
- struts2--Basic(一)
Struts是流行和成熟的基于MVC设计模式的WEB应用程序框架. 帮助我们减少在运用MVC设计模式来开发Web应用的时间. 1.下载添加jar包 2. 准备配置文件 web.xml <filt ...
- 关于c++中的全局变量(不赋值的全局变量算定义)
定义有三种: 1.不赋值的定义:int a; 2.赋值的定义:int a=5; 或者 int a;a=5; 3.加extern的定义:extern int a=5;//其实和不加是一样的. 声明只有一 ...
- codeforces 632B B. Alice, Bob, Two Teams(暴力)
B. Alice, Bob, Two Teams time limit per test 1.5 seconds memory limit per test 256 megabytes input s ...
- Mule ESB学习【转-结合了网络上的一些资源】
1.SOA标准之一:SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...
- bzoj 4260: REBXOR Trie+乱搞
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4260 题解: 啊啊啊. 被这种SB题坑了半天. 求出异或前缀和后 从n到1枚举\(r_1 ...
- bzoj 2395 Timeismoney —— 最小乘积生成树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 参考博客:https://www.cnblogs.com/autsky-jadek/p ...
- virtual judge(专题一 简单搜索 B)
Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...