【问题标题】:CakePHP/MVC Admin functions placementCakePHP/MVC 管理函数放置
【发布时间】:2012-07-04 07:15:33
【问题描述】:

这个问题更多的是征求意见,而不是针对特定问题的解决方案。

我是第一次使用 CakePHP,现在正在网站的管理部分工作。

作为 MVC 或 CakePHP 开发人员,您喜欢将管理功能放在哪里?

最初我将它们放在一个 AdminController 中,但后来更改为将函数放在一个控制器中,该控制器适用于被操纵的数据类型。例如,我将用户列表/编辑放在 UserController 中。

对我来说这更有意义,因为 UserController 中可能有一些有用的功能。

如果您留下回复,请留下几句话说明原因吗?也许这是一个有争议的问题。

保重, 李

-- 编辑

if ($this->Auth->user('user_type') == 1){//double-check the user is Admin
            $this->Auth->allow('display');
            $this->Auth->allow('watch');

【问题讨论】:

    标签: php cakephp authorization


    【解决方案1】:

    我不认为这是一个有争议的问题。将管理功能放在它们各自的控制器中(即,不是全部放在一个“管理”控制器中),并使用 Cake 内置的“管理”前缀路由来保证它们的安全。这是 CakePHP 认可的方式,CakePHP 允许您通过 Bake 控制台以这种方式创建管理功能。

    您可以在 AppController 中通过几行简单的代码来保护所有以 admin_ 为前缀的控制器功能,并且所有管理功能都可以通过如下所示的整洁一致的 URL 访问:http://www.example.com/admin/my_controller/my_function

    这应该可以帮助您入门:http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing

    如果您需要更多帮助,请告诉我,我会用更多信息更新我的答案。

    编辑:更多信息...

    以下是设置管理员路由的一些步骤:

    1/ 在 app/Config/core.php 中的第 113 行附近,确保此行存在且未注释:

        Configure::write('Routing.prefixes', array('admin'));
    

    2/ 在 app/Controller/AppController.php(即控制器超类)中,在 beforeFilter 方法中测试管理员路由。不要在每个控制器的 beforeFilter 中这样做——这不符合 DRY 原则。下面以我之前的过滤方法为例:

    function beforeFilter() {
        if (isset($this->request->params['admin'])) {
                // the user has accessed an admin function, so handle it accordingly.
            $this->layout = 'admin';
            $this->Auth->loginRedirect = array('controller'=>'users','action'=>'index');
            $this->Auth->allow('login');
        } else {
                // the user has accessed a NON-admin function, so handle it accordingly.
            $this->Auth->allow();
    
        }
    }
    

    3/ 使用 admin_ 为所有管理功能添加前缀,它们应该可以通过前缀路由自动使用。

    例如。

    function admin_dostuff () { echo 'hi from the admin function'; } // This will be available via http://www.example.com/admin/my_controller/dostuff
    
    function dostuff () { echo 'hi from the NON-admin function'; } // This will be available via http://www.example.com/my_controller/dostuff
    

    设置完成后,您只需在管理函数前加上 admin_ 前缀,Cake 就会为您处理一切。有意义吗?

    编辑 2:

    这里有一些快速编写的示例代码,可以帮助您解决问题。

    function beforeFilter() {
        if (isset($this->request->params['admin'])) {
            // the user has accessed an admin_ function, so check if they are an admin.
            if ($this->Auth->user('user_type') == 1){
                // an Admin user has accessed an admin function. We can always allow that.
                $this->Auth->allow();
            } else {
                // A non-admin user has accessed an admin function, so we shouldn't allow it.
                // Here you can redirect them, or give an error message, or something
            }
        } else {
            // the user has accessed a NON-admin function, so handle it however you want.
            $this->Auth->allow(); // this example gives public access to all non-admin functions.
        }
    }
    

    【讨论】:

    • 你好。谢谢。 CakePHP 很大,像这样的事情似乎是您必须被告知或偶然发现的事情。我不确定前缀相对于我当前的系统有什么优势。现在,我有一个管理员用户类型,并在每个具有管理员功能的控制器的 BeforeFilter() 开头对其进行测试。似乎即使有前缀,我仍然需要做同样的检查。唯一的区别是 URL 和函数名称都添加了“管理员”。 - 李
    • 完全知道你对偶然发现/讲述情况的意思。 Cake 的学习曲线有点陡峭,但非常值得。我已经用更多信息更新了我的答案。如果您需要更多帮助,请告诉我。
    • 你好。感谢您的持续帮助。从您的示例来看,您所做的似乎只是在某人尝试访问管理区域时重定向他们登录。在我的系统中,用户已经登录并且系统知道他们是管理员用户。现在,在每个具有管理功能的控制器中,它会检查 BeforeFilter() 以查看是否应该存在 Auth->allow()。如果用户是管理员,是否有某种方法可以广泛允许以“admin_”开头的所有功能?
    • 您能否将之前过滤器中的一些示例代码粘贴到您原来的问题中?
    • 请参阅我的回答中的编辑 2。我写得很快,但我认为它应该可以工作或让你走上正轨。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多