CodeIgniter:检查用户是不是登录多个页面

Posted

技术标签:

【中文标题】CodeIgniter:检查用户是不是登录多个页面【英文标题】:CodeIgniter: checking if user logged in for multiple pagesCodeIgniter:检查用户是否登录多个页面 【发布时间】:2011-08-20 16:16:34 【问题描述】:

我有一个控制器,它映射到我网站的某个部分,并且其中的所有页面(方法)只有在用户登录时才会出现。否则它们应该被重定向回登录屏幕。

为了让它工作,我刚刚做了这个:

function index() 

    if ($this->session->userdata('logged_in')) 
        $this->load->view('main');

     else 
        redirect('/login');
    


function archive() 

    if ($this->session->userdata('logged_in')) 

等等...在每种方法中重复该检查。对控制器中的多个或所有方法进行一次检查的最简单方法是什么?

【问题讨论】:

我建议您为用户进程使用库。 Aauth 对此有好处。 github.com/emreakay/CodeIgniter-Aauth 【参考方案1】:

您可以在控制器的每个方法中运行代码,方法是在 __construct() 方法中运行代码:

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

也感兴趣:http://php.net/manual/en/language.oop5.decon.php

【讨论】:

要使redirect() 工作,需要加载 URL 帮助程序:$this->load->helper('url'); 您将新控制器的文件命名为 MY_Controller.php,但您将类命名为 Auth_Controller。这应该行不通,对吧?我之所以问是因为我遇到了一些非常奇怪的事情:只要我将新控制器(它扩展了基本控制器)命名为 MY_Auth_Controller,并尝试将其用作控制器的基类,CodeIgniter 就会不断崩溃。当我将其命名为“MY_Controller”时,一切都运行良好。这是为什么呢? @whage 这就是 CI 的构建方式,如果存在,它将自动加载 MY_Controller.php。 我正在使用 CI 版本。 3.0.0。我尝试了上面的代码(#2,MY_Controller),我得到一个空白页,没有 html。我注意到on this page 它说将 MY_Controller 保存在 application/libraries/ 中。无论如何,我都没有爱! @GregoryLewis for codeigniter 3 你可以在下面使用我的答案。【参考方案2】:

对于 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');
            
        
    

注意:您可以定义一个自定义配置文件来定义您排除的方法,例如 as-

//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');

【讨论】:

谢谢!解释得很好!【参考方案3】:

我使用这个功能:

然后只需从您的控制器 __construct 中调用 $this->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' );
        
    

【讨论】:

【参考方案4】:

处理此类问题的最佳方法是创建一个自定义助手,该助手应在控制器类的每个方法中调用,例如 转到 application/helpers 并创建一个文件 login_helper.php 将以下代码粘贴到帮助程序中

<?php
 defined('BASEPATH') OR exit('no direct access');

 function isLogin($sessionType)
 
   if(empty($_SESSION[$sessionType]))
         redirect(base_url('loginURL'));
 

?>

现在将这个助手加载到控制器的构造函数中。

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);
  

【讨论】:

以上是关于CodeIgniter:检查用户是不是登录多个页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CodeIgniter 中检查多个值是不是唯一

检查 codeigniter 查询错误,而不是向用户显示它们

在 Codeigniter 中检查登录和重定向不起作用?

将特定页面限制为仅在 Codeigniter 中登录用户的最佳实践是啥?

Codeigniter facebook 身份验证问题

检查用户登录的ajax页面是不是改变