我只是在寻找阻止没有查看特定网页权限的用户的方法。我尝试将一个函数放在我的后端控制器里面的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');
}
}
答案 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
等模型创建一个函数,并从您的控制器中调用它