允许使用特定凭据的视图

时间:2013-08-12 22:27:25

标签: php codeigniter

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

我正在寻找一种不同的写作功能的方式,或者只是对我应该对该功能做些什么的不同想法。

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

有了这个,我只需要调用其他控制器的contruct中的函数,并执行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');
    }
}

3 个答案:

答案 0 :(得分: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');
    }
}

答案 1 :(得分:1)

我使用hook来做这样的事情。

/* 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。

希望它有所帮助。

答案 2 :(得分:0)

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