zoukankan      html  css  js  c++  java
  • 【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;
            }
    }
  • 相关阅读:
    如何勾选 servlet如何获取?
    过滤器 如何实现获取不到用户名跳转回登录界面
    验证码
    cookie保存用户名及密码
    游标
    存储过程和自定义函数的区别
    瞎搞
    sql 试图索引
    sql 常用函数
    sql 简单的定义变量 声明 输出
  • 原文地址:https://www.cnblogs.com/jiangxu67/p/11243061.html
Copyright © 2011-2022 走看看