1

我只是在寻找阻止无权查看特定页面的用户的方法。我尝试在我的后端控制器内部的 codeigniter 核心文件夹中组合一个函数,并让我的所有后端控制器扩展它。我想把这个函数放在它们里面,以保持把这个函数放在每个控制器里面的 DRY 原则。

我正在寻找一种不同的编写函数的方式,或者只是关于我应该如何处理函数的不同想法。

public function view_allowed($user_data)
{
    if ($user_data->role_id != 4)
    {
        return false;
    }
    return true;
}

有了这个,我只需在其他控制器的结构中调用该函数并执行 if 语句,如果它返回 false 则直接到其他页面,该页面会说他们没有正确的信用来查看该页面。

有任何问题、意见和疑虑吗?

编辑 2:

我不得不进行编辑,因为我正在考虑这会做什么。我想要做的目的是在每个控制器构造上运行普通用户不应该能够查看并且只有管理员可以查看的功能。因此,如果我执行以下操作,如果用户无法查看该页面,它将如何知道重定向到不同的页面。

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Recent_activities extends Backend_Controller
{
    /**
     * Load the parent construct and any additional models, helper, libraries available. 
     * @return void 
     */
    public function __construct()
    {
        parent::__construct();
        $view_allowed = view_allowed($user_data);
    }

    public function index()
    {
        $this->breadcrumb->add_crumb('<li><a href="' . site_url() .
            'control-panel/activities/recent-activities">Activities</a></li>');
        $this->breadcrumb->add_crumb('Recent Activites');

        $activities = $this->user->get_all();

        $this->template
            ->title('Recent Activites')
            ->build('recent_activities_view');
    }
}
4

3 回答 3

1

我用一个钩子来做这样的事情。

/* Location: ./application/config/hooks.php */    
$hook['post_controller_constructor'] = array(
                                    'class'    => 'security',
                                    'function' => 'checkLogin',
                                    'filename' => 'security.php',
                                    'filepath' => 'hooks/security'
                                 );

然后是安全性:

class Security{

    var $CI;
    var $class;

    public function __construct() {
        $this->CI =& get_instance();

        $this->class = $this->CI->router->fetch_class();

                //check permission
    }
}

每次调用控制器构造函数后都会调用它,我认为它是 DRY。

希望它可以帮助某人。

于 2014-02-12T00:20:15.237 回答
1

我会为此创建一个辅助函数:

if(!function_exists('view_allowed'))
{
    function view_allowed($user_data=null)
    {
        if($user_data->role_id != 4)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

这是一篇关于如何设置辅助函数的好帖子https://stackoverflow.com/a/804520/1893629

在您的控制器中

$this->load->helper('new_helper');

//pass in $user_data
//will return true or false
$view_allowed = view_allowed($user_data);

为您的编辑 2 更新:

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Recent_activities extends Backend_Controller
{
    /**
     * Load the parent construct and any additional models, helper, libraries available. 
     * @return void 
     */
    public function __construct()
    {
        parent::__construct();
        $view_allowed = view_allowed($user_data);

        if(!$view_allowed)
        {
            redirect('go/to/a/new/page');
        }
    }

    public function index()
    {
        $this->breadcrumb->add_crumb('<li><a href="' . site_url() .
            'control-panel/activities/recent-activities">Activities</a></li>');
        $this->breadcrumb->add_crumb('Recent Activites');

        $activities = $this->user->get_all();

        $this->template
            ->title('Recent Activites')
            ->build('recent_activities_view');
    }
}
于 2013-08-12T22:50:25.093 回答
0

如果$user_data是您的模型,您可以为模型创建一个函数,hasAccess并从您的控制器调用它

于 2013-08-12T22:34:09.787 回答