codeigniter HMVC:检查控制器中各个功能的用户权限

时间:2015-05-30 06:17:57

标签: codeigniter codeigniter-hmvc

我正在使用HMVC模块扩展来进行codeigniter。阅读这篇精彩的文章 - Scalable Login System for CodeIgniter – Ion_Auth。 本文的建议是,我们可以创建多个自定义控制器,并根据登录用户的角色,将用户重定向到各自的控制器。 例如,对于Admin,他将其重定向到扩展Admin_Controller的控制器,依此类推:

class Admin_Controller extends CI_Controller {

    public function __construct() {

        parent::__construct();

        if( ! $this->ion_auth->is_admin()) {
            redirect('/');
        }
    }
}

因此,我们可以在Base控制器级别为该控制器中的所有方法/视图应用通用规则。这就是我有疑问的地方:如果我不想对该控制器内的所有视图进行全局控制,该怎么办。

或换句话说 - 如果我需要对个别观点进行特定控制,那么该怎么做呢。例如 - 我有一个名为' Blog'和方法名称 - '查看','添加','编辑'。现在,视图适用于所有类型的用户,而只有管理员应该能够添加或编辑博客。这意味着我无法放置控制器级逻辑..

class Blog_Controller extends Admin_Controller {
    // should be accessible to both Admin and non-logged in user
    public function view() {..} 

    // Following are only accessible to Admin
    public function edit() {..}
    public function create() {...}
}

我能想到的一种方法是在多个控制器中复制代码并处理特定于用户角色的视图。

1 个答案:

答案 0 :(得分:1)

您可以设置Admin_Blog_Controller http://www.telerik.com/forums/raddatepicker---highlight-today-s-date Blog_Controller,在用户构造函数和管理构造函数中加载用户数据以检查管理员访问权限。

这样你的管理员控制器也会包含来自Blog_Controller的方法view

class Admin_Blog_Controller extends Blog_Controller {

    public function __construct() {

        parent::__construct();

        if( ! $this->ion_auth->is_admin()) {
            redirect('/');
        }
    }

    public function add() {
    }

    public function edit() {
    }

    // Optional, if you want to make custom behaviour
    // in the view method of admin:
    public function view() {
        // Calling parent (Blog_Controller) view method.
        parent::view();
        // Doing our own stuff.
        // ...
    }
}


class Blog_Controller extends CI_Controller {

    protected $the_user;

    public function __construct() {

        parent::__construct();

        if($this->ion_auth->in_group('user') || $this->ion_auth->is_admin()) {
            $this->the_user = $this->ion_auth->user()->row();
            $data->the_user = $this->the_user;
            $this->load->vars($data);
        }
        else {
            redirect('/');
        }
    }

    public function view() {
    }
}

再次阅读你的帖子,我意识到这可能不是你要求的确切解决方案,因为你想在一个控制器中全部使用它?我不会删除我的回答,有人可能会发现它仍然有用。