0

我的问题有点难以解释,但我会尝试..

基本上,在tank_auth示例脚本中,如果用户尚未登录,则此代码用于重定向用户;

if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {
        $data['user_id']    = $this->tank_auth->get_user_id();
        $data['username']   = $this->tank_auth->get_username();
        $this->load->view('welcome', $data);
    }

如果您有一个登录页面并且用户每次都从头开始,那就太好了。(而且我很乐意这样做)

但我希望用户能够在(几乎)任何控制器上跳转到网站,并在顶部显示登录栏。登录时,不应将它们重定向到另一个页面。他们最终应该在他们试图访问的同一页面上。

例如,我的用户可能会立即加载example.com/food/burgers。我想要一个空白页面,但顶部只有一个登录栏。然后当他们登录时,他们最终回到“汉堡”页面,但这次还有一个汉堡列表和顶部的栏,告诉他们他们已登录,并可选择注销。

那么我该怎么做呢?我需要从每个控制器调用 auth/login 方法吗?我是否将其作为“包含”?不知道。

4

1 回答 1

6

首先,您将要创建一个基本控制器,您的所有控制器都将从中扩展。您将在此基本控制器中检查身份验证。如果他们没有登录,则将入口点 uri 保存在 cookie 中并重定向到登录页面。

// application/core/My_Controller.php
class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library('session');
        $this->load->model('tank_auth');
        if (!$this->tank_auth->is_logged_in()) {
            // save the visitors entry point and redirect to login
            $this->session->set_userdata('redirect', $this->uri->uri_string());
            redirect('auth/login');
        }
    }
}

您的主控制器将扩展MY_Controller,无需担心身份验证。

class Welcome extends MY_Controller
{
    public function index()
    {
        $data['user_id']    = $this->tank_auth->get_user_id();
        $data['username']   = $this->tank_auth->get_username();
        $this->load->view('welcome', $data);
    }
}

您的身份验证控制器不会扩展 MY_Controller 否则它将陷入重定向循环。

class Auth extends CI_Controller
{
    public function login()
    {
        $this->load->library('session');
        if (auth_success) {
             // redirect the user back to the entry point or the welcome controller
             if ($uri = $this->session->userdata('redirect')) {
                 redirect($uri);
             } else {
                 redirect('welcome');
             }
        }
        // handle authentication failure
    }
}

您也可以将其作为GET参数传递,而不是使用会话来存储重定向 uri。

于 2013-06-12T12:28:53.273 回答