0

可能重复:
CodeIgniter 身份验证 + 用户权限

我有 5 个用户类型并有权限表,我在其中向不同的用户授予不同的权限。is_view、is_delete、is_add 等权限。用户根据这些权限访问该功能。

我完成了数据库。我想在调用控制器之前检查每个页面上授予用户的权限。

4

3 回答 3

1

您应该将您的身份验证逻辑放在控制器的构造函数中

或者

在基本控制器的构造函数中(更干燥,因为您不必在所有控制器中重复逻辑)。

于 2012-10-11T06:47:07.803 回答
1

我将创建一个扩展核心控制器的新控制器。将此文件放入application/core/

class MY_AuthController extends CI_Controller {
    public function __construct() {
        // Do your auth check in here, redirect if not logged in
    }
}

然后所有需要身份验证的页面都继承这个新的控制器。您只需将此文件放在常规控制器文件夹中

class Admin extends MY_AuthController {
    // All your controller goodness in here..
}
于 2012-10-11T07:00:34.507 回答
0

我建议你阅读以下两篇文章:

1. Phil Sturgeon 关于保持干燥的帖子。

Phil 将向您介绍如何创建父控制器,其构造函数将包含会话和潜在的数据库逻辑。您此后创建的所有控制器都应从您的自定义控制器而不是本机继承CI_Controller

其次是....

2. 重新审视 Shane Pearson 的CodeIgniter 基类

Shane 的文章改进了 Phil 的技术并将您的自定义控制器从/coreto重新定位,/base并且还使用了更好__autoload()的 er。例如,这个实现允许我使用 CodeIgniter 的 CLI 类,而 Phil 却被排除在外。


给你一个想法 - 一旦完成,你的代码看起来有点像这样:

/base/MY_In_Controller.php

<?php
class MY_In_Controller extends CI_Controller{
    function __construct(){
        parent::__construct();
        //things like:
        //is the user even logged in? thank heavens I don't have to check this in every controller now. redirect if the session doesnt exist.
        //query the database and grab the permissions for the user. persist them with $this->load->vars();
        $this->data['perms'] = some_database_function();
        $this->load->vars($this->data);
    }
}

controllers/manage.php

<?php
class Manage extends MY_In_Controller{
    function __construct(){
        parent::__construct();
    }
    function index(){
        $this->load->view('manage');
        //and I can still access their permissions here and in the view.
        print_r($this->data['perms']);
    }
}
于 2012-10-12T03:56:07.853 回答