我有一个控制器,它映射到我的网站的部分,其中的所有页面(方法)只应在用户登录时出现。否则应将它们重定向回登录屏幕。
为了让它正常工作,我刚刚完成了这个:
function index() {
if ($this->session->userdata('logged_in')) {
$this->load->view('main');
} else {
redirect('/login');
}
}
function archive() {
if ($this->session->userdata('logged_in')) {
等等......在每种方法中重复检查。对控制器中的多重或全部方法执行此检查的最简单方法是什么?
答案 0 :(得分:45)
通过在__construct()
方法中运行代码,您可以在Controller的每个方法中运行代码:
function __construct()
{
parent::__construct();
if ( ! $this->session->userdata('logged_in'))
{
// Allow some methods?
$allowed = array(
'some_method_in_this_controller',
'other_method_in_this_controller',
);
if ( ! in_array($this->router->fetch_method(), $allowed)
{
redirect('login');
}
}
}
如果要限制对整个内容的访问,可以删除“允许”位,但有更好的方法可以执行此操作,例如创建基本控制器:
// Create file application/core/MY_Controller.php
class Auth_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
if ( ! $this->session->userdata('logged_in'))
{
redirect('login');
}
}
}
然后让受限制的控制器扩展Auth_Controller
而不是CI_Controller
。现在,每次加载控制器时都会运行代码。
有关扩展核心类的更多信息:http://www.codeigniter.com/user_guide/general/core_classes.html#extending-core-class
答案 1 :(得分:5)
对于codeIgniter 3,我修改了Wesley Murch对此的回答
//创建文件application / core / MY_Controller.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
if ( !$this->session->userdata('logged_in'))
{
redirect('login');
}
}
}
然后在任何控制器中检查我使用的授权
类新闻扩展了MY_Controller { //代码在这里 }
如果您为网站用户和管理员用户使用模块和不同的会话,您可以使用此代码将它们完美地重定向到不同的登录页面 -
function __construct() {
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
// echo "<pre>";print_r($this->router);echo "</pre>";
/**
* if webmaster then check admin session else check user session
* But there may be some classes's method that doesn't requires login hence it is also need to check if
* current request is for those methods before checking session
*/
//to use $this->config->item('webmaster_name') this you have to define
// $config['webmaster_name'] = "webmaster"; in config.php file
if ($this->router->module == $this->config->item('webmaster_name')) {
if (!$this->session->userdata('admin')['id']) {
redirect($this->config->item('webmaster_name').'/login');
}
} else {
if (!$this->session->userdata('user')['id']) {
redirect('login');
}
}
}
如果您还希望用户允许在未登录的情况下从任何特定控制器访问某些方法,则可以使用此代码 -
function __construct() {
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
//echo "<pre>"; print_r($this->router);echo "</pre>"; //_pr($this->config->item('excluded_auth'));
/**
* if webmaster then check admin session else check user session
* But there may be some classes's method that doesn't requires login hence it is also need to check if
* current request is for those methods before checking session
*/
if ($this->router->module == $this->config->item('webmaster_name')) {
if (!$this->session->userdata('admin')['id']) {
redirect($this->config->item('webmaster_name') . '/login');
}
} else {
if (array_key_exists($this->router->class, $this->config->item('exclude_auth')) && in_array($this->router->method, $this->config->item('exclude_auth')[$this->router->class])) {
//echo "escape this method. don not validate for a session";
} else {
if (!$this->session->userdata('user')['id']) {
redirect('login');
}
}
}
}
注意:您可以定义自定义配置文件来定义排除的方法,例如 -
//save file in application/config/without_auth_methods.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$config['exclude_auth']['news'] = array('index', 'view');
$config['exclude_auth']['users'] = array('index');
答案 2 :(得分:1)
我使用这个功能:
然后从控制器__construct中调用$ this-&gt; isAuthorized。
它允许我控制访问哪些控制器以及访问哪些方法。
protected function isAuthorized()
{
switch ( strtolower( $this->router->class ) )
{
case 'pages':
$disallowLoggedOut = array( 'dashboard' );
$disallowLoggedIn = array( 'index' );
break;
case 'users':
$disallowLoggedOut = array( 'logout' );
$disallowLoggedIn = array( 'register', 'login' );
break;
}
if ( $this->session->userdata( 'loggedIn' ) )
{
if ( in_array( $this->router->method, $disallowLoggedIn ) )
{
redirect( 'pages/dashboard' );
}
}
else
{
if ( in_array( $this->router->method, $disallowLoggedOut ) )
{
redirect( 'pages/index' );
}
}
}
答案 3 :(得分:0)
处理此类问题的最佳方法是创建一个应该在控制器类的每个方法中调用的自定义帮助程序,例如 转到application / helpers并创建一个login_helper.php文件 将以下代码粘贴到帮助程序
中<?php
defined('BASEPATH') OR exit('no direct access');
function isLogin($sessionType)
{
if(empty($_SESSION[$sessionType]))
redirect(base_url('loginURL'));
}
?>
现在将此助手加载到Controller的构造函数中。
application/controllers/Access.php
这样
defined('BASEPATH') OR exit('access denied');
class Access Extends CI_Controller
{
funcrion __construct()
{
parent::__construct();
$this->load->helper('login');
}
function home()
{
isLogin();
$this->load->view('home_page);
}
}