opencart Version 3.0.3.3 插件开发, 开发完成后安装插件 提示 Permission Denied! 逻辑分析代码
底部有插件开发模板的文件目录和文件实例。 整体demo文件 请到我的资源里下载。 Abc3.0.3.3.ocmod.zip
百度了很多文章,设置user--user group access 权限等, 还是决定跟踪一下代码,了解一下。
管理入口页面 admin/index.php
<?php
// Version
define('VERSION', '3.0.3.3');
// Configuration
if (is_file('config.php')) {
require_once('config.php');
}
// Install
if (!defined('DIR_APPLICATION')) {
header('Location: ../install/index.php');
exit;
}
// Startup
require_once(DIR_SYSTEM . 'startup.php');
start('admin');
------
包含同级的config.php文件
define('DIR_STORAGE', '/home/bjdental/www/aaaa/storage/');
define('DIR_MODIFICATION', DIR_STORAGE . 'modification/');
define('DIR_SYSTEM', '/home/bjdental/www/aaaa/system/');
查看文件 /system/startup.php文件 ,执行函数 start('admin');
==============
/system/startup.php文件中 代码片段
// Autoloader
if (is_file(DIR_STORAGE . 'vendor/autoload.php')) {
require_once(DIR_STORAGE . 'vendor/autoload.php');
}
// Engine
require_once(modification(DIR_SYSTEM . 'engine/action.php'));
require_once(modification(DIR_SYSTEM . 'engine/controller.php'));
require_once(modification(DIR_SYSTEM . 'engine/event.php'));
require_once(modification(DIR_SYSTEM . 'engine/router.php'));
require_once(modification(DIR_SYSTEM . 'engine/loader.php'));
require_once(modification(DIR_SYSTEM . 'engine/model.php'));
require_once(modification(DIR_SYSTEM . 'engine/registry.php'));
require_once(modification(DIR_SYSTEM . 'engine/proxy.php'));
// Helper
require_once(DIR_SYSTEM . 'helper/general.php');
require_once(DIR_SYSTEM . 'helper/utf8.php');
function start($application_config) {
require_once(DIR_SYSTEM . 'framework.php');
}
执行函数 start(admin) 引入同级的文件 framework.php
==========
文件 framework.php重点 就是这段 页面内容显示,上方都可用var_dump调试
// Route
$route = new Router($registry); var_dump($route); echo '<hr>'; // 从route中看到 action_pre_action
// Pre Actions
if ($config->has('action_pre_action')) {
foreach ($config->get('action_pre_action') as $value) { var_dump($value); echo '<hr>';
$route->addPreAction(new Action($value)); /// 文件 /system/engine/router.php 中 分析 addPreAction函数
}
}
// Dispatch
$route->dispatch(new Action($config->get('action_router')), new Action($config->get('action_error')));
/// 上边分析出数据后, 再分析 route->dispatch 的函数
// Output
$response->output();
=============
文件 /system/engine/router.php 中 分析
public function dispatch(Action $action, Action $error) {
$this->error = $error;
foreach ($this->pre_action as $pre_action) { var_dump($pre_action); echo '<hr>';
$result = $this->execute($pre_action);
if ($result instanceof Action) {
$action = $result;
break;
}
}
while ($action instanceof Action) {
$action = $this->execute($action);
}
}
private function execute(Action $action) {
/// 这里execute 函数的参数是 Action 类,
///比如 string(18) "startup/permission" 那要接着分析 \admin\controller\startup\permission.php 文件了 , 这里是最关键的逻辑
$result = $action->execute($this->registry);
if ($result instanceof Action) {
return $result;
}
if ($result instanceof Exception) {
$action = $this->error;
$this->error = null;
return $action;
}
}
====================
\admin\controller\startup\permission.php 文件
<?php
class ControllerStartupPermission extends Controller {
public function index() {
if (isset($this->request->get['route'])) {
$route = '';
$part = explode('/', $this->request->get['route']);
array(3) { [0]=> string(9) "extension" [1]=> string(3) "abc" [2]=> string(3) "aaa" }
if (isset($part[0])) {
$route .= $part[0]; / extension
}
if (isset($part[1])) {
$route .= '/' . $part[1]; abc
}
// If a 3rd part is found we need to check if its under one of the extension folders.
/// 如果第三方插件的目录 是不是在数组里?
$extension = array(
'extension/advertise', ///广告
'extension/dashboard', /// 面板
'extension/analytics', /// 分析
'extension/captcha', /// 验证
'extension/extension', /// 扩展插件
'extension/feed', /// 订阅
'extension/fraud', /// 黑色
'extension/module', /// 模块
'extension/payment', /// 支付
'extension/shipping', /// 快递 运输
'extension/theme', /// 主题 模板
'extension/total', /// 总数
'extension/report', /// 报表
'extension/openbay' /// 支付
);
/// 是否 所有的开发插件 只能放在以上的目录文件下,才能满足下边in_array的条件? 决定abc修改成module 解决问题。
if (isset($part[2]) && in_array($route, $extension)) { /// $part[2]=aaa $route=extension/abc 如果在数组里 则 $route=extension/abc/aaa
$route .= '/' . $part[2];
}
// We want to ingore some pages from having its permission checked.
忽略权限判断的文件目录
$ignore = array(
'common/dashboard',
'common/login',
'common/logout',
'common/forgotten',
'common/reset',
'error/not_found',
'error/permission'
);
if (!in_array($route, $ignore) && !$this->user->hasPermission('access', $route)) { /// 如果 不再上边的路径列表里, 就会提示 Permission Denied!
return new Action('error/permission'); /// 这就是Permission Denied!
}
}
}
}
Permission Denied!
Permission Denied!
You do not have permission to access this page, please refer to your system administrator.
OpenCart © 2009-2021 All Rights Reserved.
Version 3.0.3.3
修改文件夹的名称 和 php的类名称, 再安装 使用, 可正常访问了。
http://www.aaa.net/admin/index.php?route=extension/module/aaa&user_token=RRWkbd0t0L1CjG8OtFBHr1z3F26qLHTU
目录结构如下:
install.xml 文件内容如下: 不修改框架的核心访问, 都使用新增文件的方式扩展插件。
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Abc 001</name>
<version>Abc 001</version>
<code>Abc 001</code>
<author>Dragon Chen()</author>
<link>http://www.aaa.net/</link>
<file>
<operation>
<search><![CDATA[ ]]></search>
<add><![CDATA[ ]]></add>
</operation>
</file>
</modification>
opencart\Abc3.0.3.3.ocmod\upload\admin\controller\extension\module\aaa.php 实例内容如下:
E:\htdocs\opencart\Abc3.0.3.3.ocmod\upload\admin\language\en-gb\extension\module\aaa.php实例内容如下:
E:\htdocs\opencart\Abc3.0.3.3.ocmod\upload\admin\model\extension\module\aaa.php实例内容如下:
E:\htdocs\opencart\Abc3.0.3.3.ocmod\upload\admin\view\template\extension\module 实例内容如下:
整体demo文件 请到我的资源里下载。 Abc3.0.3.3.ocmod.zip
下边是安装步骤 :
直接就可以访问了
http://www.aaa.net/admin/index.php?route=extension/module/aaa&user_token=RRWkbd0t0L1CjG8OtFBHr1z3F26qLHTU
如果涉及到权限问题 , 还可以操作。
或者 opencart\Abc3.0.3.3.ocmod\upload\admin\controller\extension\module\aaa.php 代码里 访问http://www.aaa.net/admin/index.php?route=extension/module/aaa/install&user_token=RRWkbd0t0L1CjG8OtFBHr1z3F26qLHTU
/// 配置权限
public function install() {
$user_group_id = $this->user->getGroupId();
$this->load->model('user/user_group');
$this->model_user_user_group->addPermission($user_group_id,'access','extension/module/aaa');
$this->model_user_user_group->addPermission($user_group_id,'modify','extension/module/aaa');
}