opencart Version 3.0.3.3插件开发 分析 安装插件 提示  Permission Denied! 逻辑分析代码

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']);

 http://www.aaa.net/admin/index.php?route=extension/abc/aaa&user_token=RRWkbd0t0L1CjG8OtFBHr1z3F26qLHTU

 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');
    }
 

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值