部署: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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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吗?