2

我正在尝试使用 codeigniter 构建一个 Web 应用程序。我已安装 Ion Auth 作为我的身份验证模型。

默认的 Auth.php 控制器对用户进行身份验证并设置会话。

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Auth extends CI_Controller {



    function __construct()
    {
        parent::__construct();
        $this->load->library('ion_auth');
        $this->load->library('session');
        $this->load->library('form_validation');
        $this->load->helper('url');

        $data['title']="Login Page";
        $this->load->view("view_site_header",$data);

        // Load MongoDB library instead of native db driver if required
        $this->config->item('use_mongodb', 'ion_auth') ?
        $this->load->library('mongo_db') :

        $this->load->database();    

        $this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth'));
    }

    //redirect if needed, otherwise display the user list
    function index()
    {
        // if not logged in - go to home page
        if (!$this->ion_auth->logged_in())
        {
            //redirect them to the login page
            redirect('auth/login', 'refresh');
        }
        // if user is an admin go to this page
        elseif ($this->ion_auth->is_admin())
        {
            // if an admin, go to admin area

            //set the flash data error message if there is one
            $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');

            //list the users
            $this->data['users'] = $this->ion_auth->users()->result();
            foreach ($this->data['users'] as $k => $user)
            {
                $this->data['users'][$k]->groups = $this->ion_auth->get_users_groups($user->id)->result();
            }

            $this->_render_page('auth/view_users', $this->data);                
        }   else
    {
        //redirect them to the default home page 
        $data['title']="IMS Home Page";
        $this->load->view("generic/view_site_header",$data);
        $this->load->view("generic/view_generic_nav");
        $this->load->view("generic/view_content_generic");
        $this->load->view("view_site_footer");
    }
}

我想要做的是为我的应用程序逻辑创建一个新的控制器,并留下身份验证控制器进行身份验证。

在访问我的新控制器时,如何使用 auth 控制器来确保我的用户已登录?此外,我需要新控制器可以使用会话信息。

我的新控制器 master_data 具有以下代码:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Masterdata extends CI_Controller{

    function index ()
    {
            $data['title']="Master Data Home Page";
            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_home");
            $this->load->view("master_data/view_master_data_footer");

            echo $this->session->userdata('username');



    }
}

显然这echo $this->session->userdata('username');不起作用,因为新控制器不知道身份验证控制器会话。

一如既往地感谢任何帮助。

亲切的问候,

4

3 回答 3

11

首先自动加载 ion_auth 库。如果您只是想检查用户是否已登录,只需在您加载的每个控制器的构造函数中检查它

public function __construct() {  
    parent::__construct();

    if (!$this->ion_auth->logged_in()) {
       // redirect to login view
    } 
}

如果你碰巧有多个组,你可以在 application/core/MY_controller 中创建一个新的控制器。这个控制器将检查用户是否登录。你可以扩展这个基本控制器来创建新的控制器。对此给出了很好的解释大卫约翰。检查这个链接

于 2013-03-01T03:37:06.227 回答
2

显然 echo $this->session->userdata('username'); 不起作用,因为新控制器不知道身份验证控制器会话。

嗯...如果会话库已加载,那么是的...调用它的控制器将能够访问会话变量 $username。

我们处理这个问题的方法是在 application/core 目录中创建一个新的控制器父类,如 MY_Controller 。此类加载公共库/包(如 session 和 ion_auth)。您还可以自动加载库和助手。

由于 ion_auth 将所有用户配置文件数据存储在会话 var 中,因此您(在后续的、未经过身份验证的)页面上只需要会话库来检索有关登录用户的会话数据。

你真的应该检查他们的身份验证状态,并优雅地失败:

if (!$this->ion_auth->logged_in()) {
    // echo a login link
} else {
    // echo session var for username
}

那样的东西...

于 2013-02-28T19:49:11.207 回答
0

jcorry 的方法应该有效。另一种方法(将为您的整个应用程序提供更大的灵活性是使用模块化布局 - https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc

您将不得不做一些摆弄才能让它与 ion auth 很好地配合使用,但是按照这个问题中的说明对我有用:Using Ion Auth as a separate module in the HMVC structure(看看 forks of ion在 git hub 上进行身份验证 - 我想有人可能已经为你做了)

这种方法将允许您使用这种语法从应用程序的任何位置(如果需要,甚至从视图)访问任何控制器中的任何方法:modules::run('module/controller/method', $params);

这实际上将允许您将现有的 ion auth 控制器开发为用户管理控制器,您可以从您创建的任何其他控制器访问它(又好又干)。

于 2013-02-28T20:11:48.173 回答