我在为我的应用程序创建身份验证部分时遇到问题。
以下是我的控制器的简化版本。
这个想法是MY_controller检查是否存在具有用户数据的会话。 如果没有,则重定向到您必须登录的索引页面。
MY_controller.php
class MY_Controller extends Controller {
function __construct()
{
parent::__construct();
$this->load->helper('url');
$this->load->library('session');
if($this->session->userdata('user') == FALSE) {
redirect('index');
} else {
redirect('search');
}
}
}
order.php - 主控制器
class Orders extends MY_Controller {
function __construct()
{
parent::__construct();
$this->load->helper('url');
$this->load->library('session');
}
function index()
{
// Here would be the code that validates information input by user.
// If validation is successful, it creates user session.
$this->load->view('header.html', $data); // load header
$this->load->view('index_view', $data); // load body
$this->load->view('footer.html', $data); // load footer
}
function search()
{
//different page
}
正在发生的事情是浏览器告诉我“页面没有正确重定向。 Firefox检测到服务器正在以永远不会完成的方式重定向该地址的请求。“
似乎redirect()正在循环播放。我查看了一些其他用户身份验证的例子,他们使用类似的技术构建。
答案 0 :(得分:2)
当用户已登录时,您似乎想要将其重定向到/search/
。重定向发生,并再次调用构造函数,它识别用户已经登录,因此它将它们重定向到/search/
...你明白了。
我首先将您的登录逻辑分离到它自己的控制器中,该控制器不会从MY_Controller
延伸。
答案 1 :(得分:0)
另请注意,未登录时,您的控制器会重定向到“索引”。如果Index控制器也基于My_Controller,那么它将重定向回自身(直到用户登录,然后Dolph Mathews的答案成真)。
您需要提供一个没有检查/重定向的“安全区域”,为用户提供登录表单(并注意您的登录控制器/方法也必须具有开放访问权限!)
我倾向于将一个网关方法弹出到My_Controller中,My_Controller只根据需要由私有控制器/方法调用(在完全私有控制器的构造函数中)。我确信必须有更好的方法,或许像你的My_Controller中的网关功能(正如你的那样)但是过滤了URI路径(例如允许索引;索引/登录;索引/注销等)