poorX

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  117 随笔 :: 0 文章 :: 11 评论 :: 16万 阅读

部署: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;
        }
}
复制代码

 

posted on   poorX  阅读(280)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示