【mongoDB】Rockmongo代码结构及接入第三方认证

部署:https://www.cnblogs.com/jiangxu67/p/11214910.html

目录结构

├── app 后台逻辑
├── config.php 配置
├── index.php 访问入口
├── js
├── logs 自定义日志
├── rock.php 全局路由
├── sso.php 自定义第三方认证
├── test
└── themes 页面

页面功能修改

1、themes路径下的页面文件

2、js异步渲染

使用第三方认证

在index.php的start方法调用前判断cookie的token

<?php

require "sso.php";

$ssor = check_cookie_global($_COOKIE);
if ( $ssor ) {
        Rock::start( $ssor );
}


?>

全局的继承关系

以CollectionController为例,其余controllers下的继承关系相同

rock.php:class RController {}
app/lib/ext/RExtController.php:class RExtController extends RController {}
app/classes/BaseController.php:class BaseController extends RExtController {}
app/controllers/collection.php:class CollectionController extends BaseController {}

入口及路由

拿到path到RController

class Rock {
        private static $_controller;

        public static function start($ssouser) {
                $path = x("action");
                if (!$path) {
                        $path = "index.index";
                }
                if (!strstr($path, ".")) {
                        $path .= ".index";
                }
                if (!preg_match("/(^.*(?:^|\.))(\w+)\.(\w+)$/", $path, $match)) {
                        trigger_error("you called an invalid action");
                }
        }
}

不跳rockmongo的login

RController的exec方法

class RController {

        public function onBefore($ssouser) {

        }

        public function exec($ssouser) {
                Rock::setController($this); //子类

                $this->onBefore($ssouser); //注意子类onBefore的重写
        }
}        

BaseController的onBefore设置用户登录

class BaseController extends RExtController {

        public function onBefore($ssouser) {

                $this->_server = MServer::serverWithIndex(0);
                MUser::login(
                        $ssouser, $ssouser, 0,
                        $this->_server->mongoDb(),
                        10800
                );
                $muserObj = new MUser();
                $muserObj->setUsername($ssouser);
                $muserObj->setPassword($ssouser);
                $muserObj->setDb($this->_server->mongoDb());
                $muserObj->setHostIndex(0);
                $this->_admin = $muserObj;
                setcookie("ROCK_LANG", x("lang"), time() + 365 * 86400);
                if (!$this->_admin) {
                if (!$this->_admin->validate($ssouser)) {
                }
                $this->_mongo = $this->_server->mongo();

        }  
}

MUser的validate

class MUser {

        public function validate($ssouser) {
                import("@.MServer");
                $server = MServer::serverWithIndex(0);
                $server->addControlUser($ssouser, $ssouser);
                if (empty($server)) {
                        return false;
                }
                return $server->auth($this->_username, $this->_password, $this->_db);
        }

}

MServer的auth

1、修改副本集连接强制secondary

2、mongoAuth和controlAuth的区别

class MServer {

        public function auth($username, $password, $db = "admin") {
                try {
                        $options = $this->_mongoOptions;
                        if ($this->_mongoAuth) {
                               
                        }
                        if($this->_controlAuth && !empty($this->_mongoUser) && !empty($this->_mongoPass) && !empty($this->_mongoDb)) {
                                
                        }
                        # readPreference=secondaryPreferred
                        # $options['readPreference'] = 'secondary';
                        $this->_mongo = new RMongo($server, $options);
                        $this->_mongo->setReadPreference(Mongo::RP_SECONDARY);
                        $this->_mongo->setSlaveOkay(true);
                }
                catch(Exception $e) {
                        if (preg_match("/authenticate/i", $e->getMessage())) {
                                return false;
                        }
                        echo "Unable to connect MongoDB, please check your configurations. MongoDB said:" . $e->getMessage() . ".";
                        exit();
                }

                //auth by mongo
                if ($this->_mongoAuth) {
                }
                //auth by rock
                else if ($this->_controlAuth) {
                        if (!isset($this->_controlUsers[$username]) || $this->_controlUsers[$username] != $password) {
                                return false;
                        } else {
                                return true;
                        }
                        //authenticate
                        if (!empty($this->_mongoUser)) {
                                        return $this->_mongo
                                                ->selectDB($db)
                                                ->authenticate($this->_mongoUser, $this->_mongoPass);
                                }
                        }
                }
                else {
                        //authenticate
                        if (!empty($this->_mongoUser)) {
                                // "authenticate" can only be used between 1.0.1 - 1.2.11
                                if (RMongo::compareVersion("1.0.1") >= 0 && RMongo::compareVersion("1.2.11") < 0) {
                                        return $this->_mongo
                                                ->selectDB($db)
                                                ->authenticate($this->_mongoUser, $this->_mongoPass);
                                }
                        }
                }
                return true;
        }
}
原文地址:https://www.cnblogs.com/jiangxu67/p/11243061.html