首页 文章

对另一个控制器中的codeigniter使用离子身份验证

提问于
浏览
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控制器进行身份验证 .

如何在访问新控制器时使用auth控制器确保用户登录?此外,我需要为新控制器提供ession信息 .

我的新控制器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'); 不起作用,因为新控制器不知道auth控制器会话 .

任何帮助一如既往的赞赏 .

亲切的问候,

3 回答

  • 0

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

    public function __construct() {  
        parent::__construct();
    
        if (!$this->ion_auth->logged_in()) {
           // redirect to login view
        } 
    }
    

    如果您碰巧有多个组,您可以在application / core / MY_controller中创建一个新的控制器 . 该控制器将检查用户是否已登录 . 您可以扩展此基本控制器以创建新控制器 . 给出了一个非常好的解释作者:David john . 查看这个link .

  • 10

    显然是echo $ this-> session-> userdata('username');因为新控制器不知道auth控制器会话,所以不起作用 .

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

    我们处理它的方法是在application / core目录中创建一个新的控制器父类,如MY_Controller . 该类加载公共库/包(如session和ion_auth) . 您还可以自动加载库和帮助程序 .

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

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

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

    这样的东西......

  • 2

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

    你将不得不做一些摆弄,让它与离子auth很好地玩,但按照这个问题的说明为我工作:Using Ion Auth as a separate module in the HMVC structure(看看git hub上的离子auth的分叉 - 我想有人可能有已经为你完成了)

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

    这基本上允许您将现有的离子auth控制器开发到用户管理控制器中,您可以从您创建的任何其他控制器(良好和干燥)访问该控制器 .

相关问题