zoukankan      html  css  js  c++  java
  • 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 中查看日志:

  • 相关阅读:
    Best Practices for Using Alpha
    Android手机 Fildder真机抓包
    Android调用MediaScanner进行新产生的媒体文件扫描
    读书笔记-----Java并发编程实战(二)对象的共享
    项目经验谈---IM新消息界面刷新异常处理记录
    读书笔记-----Java并发编程实战(一)线程安全性
    OnScroll与OnTouchEvent方法的区别与联系
    View的getLeft, getRight, getTop, getBottom
    如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN
    更改ubuntu mysql data目录位置
  • 原文地址:https://www.cnblogs.com/dapianzi/p/7845775.html
Copyright © 2011-2022 走看看