我正在尝试使用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控制器会话。
一如既往地感谢任何帮助。
亲切的问候,
答案 0 :(得分:11)
首先自动加载ion_auth库。 如果您只是想检查用户是否已登录,只需在每个控制器的构造函数中检查它即可
public function __construct() {
parent::__construct();
if (!$this->ion_auth->logged_in()) {
// redirect to login view
}
}
如果您碰巧有多个组,您可以在application / core / MY_controller中创建一个新控制器。该控制器将检查用户是否已登录。您可以扩展此基本控制器以创建新控制器。一个非常好的解释这是David john给出的。查看link。
答案 1 :(得分:2)
显然是echo $ this-&gt; session-&gt; userdata('username');因为新控制器不知道auth控制器会话,所以不起作用。
呃......如果加载了会话库,那么是......调用它的控制器将能够访问会话变量$ 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
}
像这样......
答案 2 :(得分:0)
jcorrys方法应该有效。另一种方法(为整个应用程序提供更大的灵活性)是使用模块化布局 - https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc
你必须做一些摆弄才能让它与离子auth很好地配合,但按照这个问题中的说明为我工作:Using Ion Auth as a separate module in the HMVC structure(看看git上离子auth的分叉hub - 我想有人可能已经为你做过了)
这种方法允许您使用这种语法从应用程序的任何位置访问任何控制器中的任何方法(即使是在需要时从视图中访问):modules::run('module/controller/method', $params);
这基本上允许您将现有的离子auth控制器开发到用户管理控制器中,您可以从您创建的任何其他控制器(良好和干燥)访问该控制器。