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的更多相关文章

  1. CAS客户端整合(二) Zabbix

    Zabbix是一个强大的服务器/交换机监控应用,有zabbix-server, zabbix-client, zabbix-web 三部分.zabbix-web管理端是用php写的. 前文参考:CAS ...

  2. CAS客户端整合(三) Otrs

    OTRS 是用Perl写的一个工单邮件系统,非常强大. 登录流程 流程图略过 otrs没有像 discuz 和 zabbix 类似的游客登录状态,这样处理起来逻辑分支少一些. 不过还是考虑用 otrs ...

  3. CAS客户端整合(一) Discuz!

    有好几个系统需要接入CAS,所以登录模块统统需要重构 版本 CAS服务端是Java的 Cas-server-4.0 CAS的php客户端 是 phpCAS-1.2.0 论坛版本是 Discuz!X3. ...

  4. 品优购商城项目(六)CAS客户端与SpringSecurity集成

    cas单点登录旨在解决传统登录模式session在分布式项目中共享登录信息的问题. 本文cas服务器使用 4.0版本,仅供学习参考.把 cas.war 直接部署在tomcat即可,这里有个固定的用户名 ...

  5. cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...

  6. springboot之cas客户端

    一.CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源.对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 ...

  7. SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...

  8. CAS客户端与SpringSecurity集成

    4. CAS客户端与SpringSecurity集成 4.1 Spring Security测试工程搭建 (1)建立Maven项目casclient_demo3 ,引入spring依赖和spring ...

  9. cas sso 整合记录

    首先说明下,我使用的cas-server版本是4.2.1 整合过程中遇到的问题及解决方式如下 1.因为使用https的话证书是个麻烦事,所以启用http 修改cas-server-webapp下的ca ...

随机推荐

  1. DBGrideh 实现自动排序

    一.点击标题自动排序 1.在optioneh中设置:AutosortMarking:=True2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)sortlocal:=True;3 ...

  2. adt-bundle-windows-x86_64-20130522.zip 下载

    直接复制这个链接到迅雷下载即可:http://dl.google.com/android/adt/adt-bundle-windows-x86_64-20130522.zip

  3. Agc017_D Game on Tree

    传送门 题目大意 给定一棵树,$1$号节点为根,两个人轮流操作,每次选择一个根节点外的点,删掉它以及它的子树,不能操作者输,求两人均采用最优策略下先手胜利还是后手胜利. 题解 经典问题树上删边游戏,根 ...

  4. java基础回顾之IO

    Java的IO 是Java运用重要部分之一,涉及到的内容也比较多,容易混淆,一段时间不用,可能就会遗忘,要时常回顾记忆一下: (图片来源于网络) Java 流在处理上分为字符流和字节流. 字符流处理的 ...

  5. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  6. Unity3d中SendMessage 用法

      Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastM ...

  7. linux绑定多个ip(转载)

    在Linux下有时候需要给一个网卡绑定多个IP,本文介绍在Redhat系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法. 1. ...

  8. js的数据格式之json

    //json数据格式语法:1 数据在名称/值对中2 数据由逗号分隔3 花括号保存对象4 方括号保存数组 详情请查看:js的数据格式之json

  9. 广度优先搜索(BFS)

    广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法.简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点 ...

  10. js字符串API

    1.charAt(n) :返回字符串n位置的字符 2.substr(n,m):n:开始截取的位置 m:截取的长度 2.substring(n,m):n:开始截取的位置 m:截取结束的位置 3.repl ...