在CodeIgniter中的每个页面上保留Tank Auth

时间:2013-06-12 11:34:33

标签: codeigniter authentication

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

基本上,在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方法?我是否将其作为“包含”?不知道。

1 个答案:

答案 0 :(得分: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。