当前,如果我访问了主/订阅者,则在未登录时可以查看页面,我已在主控制器中创建了一个函数-请参阅用户角色页面重定向代码点火器以了解代码的清晰度。
public function subscriber() {
$this->load->view('header', $data);
$this->load->view('dashboard/subscriber', $data);
$this->load->view('footer');
}
根据用户是否登录来保护不同路由的最简单方法是使用会话变量。当用户登录你的应用程序时,设置一个类似的会话变量
$this->session->set_userdata('is_logged_in', TRUE);
并在控制器的构造函数中检查该变量,以便在调用任何方法之前验证用户。
class Demo_controller extends CI_Controller{
public function __construct(){
parent::__construct();
// check if user is logged in
if(!$this->session->userdata('is_logged_in')){
// user is not logged in then redirect user to any page you want
}
}
}
你也可以在Codeigniter 中使用钩子来创建这样的系统
您需要保护您的页面。假设您的$_SESSION['email']
变量仅在用户登录时设置。我们可以将其用作确定用户是否登录的标志。
将这些函数添加到User_model
中(确保模型已自动加载(。
public function is_logged() {
if (is_null($this->session->userdata('email')) {
redirect('main/login');
exit; // just in case
}
}
public function is_allowed($perm) {
$roles = $this->session->userdata('roles');
if ($roles !== 'admin' && $perm !== $roles) {
// maybe set flashdata so user knows why they were redirected
redirect('main/' . $roles);
exit; // just in case
}
}
然后控制器:
class Subscriber extends CI_Controller {
public function construct() {
parent::__construct();
$this->user_model->is_logged(); // can merge with below func, just make sure it is called first (!imp)
$this->user_model->is_allowed('subscriber');
}
public function subscriber() {
$this->load->view('header', $data);
$this->load->view('dashboard/subscriber', $data);
$this->load->view('footer');
}
}
这是最基本的。如果你愿意,你可以做得更花哨一些。我个人使用基于数据库的ACL系统。
还要考虑在数据库和其他地方将roles
重命名为role
,考虑到用户只有一个角色(考虑到您之前的问题(,这会令人困惑。
如果您想阻止用户在未登录codeigniter的情况下访问某些页面,
登录时应首先使用set_userdata
。
按如下方式更改控制器。当会话数据不为空时,它会将您重定向到特定页面。否则,"写下需要做的事情"。
public function subscriber()
{
if($this->session->userdata('id')!="")
{
$this->load->view('header', $data);
$this->load->view('dashboard/subscriber', $data);
$this->load->view('footer');
} else {
//your code here
}
}