codeigniter登录和用户会话

时间:2015-01-01 14:06:21

标签: php codeigniter session login

我通过本指南构建了一个用户登录我的网站: http://www.iluv2code.com/login-with-codeigniter-php.html

我对会话

的问题很少

我需要把session_start();在每个控制器中,或者在codeigniter中有一种方法,它将自动在所有控制器中? (我应该这样做吗?)

并且还有另一种方法可以放入每个功能:

    if($this->session->userdata('logged_in'))
    {
       //function code
    }else{
     //If no session, redirect to login page
     redirect('../login', 'refresh');
   }

或者我是否应该为每个控制器功能执行此操作(例如,如果我有控制器命名页面并且他具有以下功能:索引,编辑,视图我需要为每个控制器功能添加它?

和最后一个问题,我在view / header调用的每个页面顶部都有注销按钮 我是否也应该使用此功能:

 function logout()
 {
   $this->session->unset_userdata('logged_in');
   session_destroy();
   redirect('home', 'refresh');
 }

在每个控制器中,或者我可以用某种方式做“golbel”功能?

编辑: 我在hooks.php中使用它:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
|   http://codeigniter.com/user_guide/general/hooks.html
|
*/

$hook['post_controller_constructor'] = array(
                                'class'    => 'SessionData',
                                'function' => 'initializeData',
                                'filename' => 'loginHelper.php',
                                'filepath' => 'hooks',
                                'params'   => array()
                                );
and this in loginHelper.php:
<?
class SessionData {
    var $CI;

    function __construct(){
        $this->CI =& get_instance();
        if(!isset($this->CI->session))  //Check if session lib is loaded or not
          $this->CI->load->library('session');  //If not loaded, then load it here
    }

    function initializeData() {
          // This function will run after the constructor for the controller is ran
          // Set any initial values here
          if(!$this->CI->session->userdata('logged_in')){    //call session methods with super object
            redirect('../login', 'refresh');    
          }else{
            $data['user'] = $this->CI->session->userdata('logged_in');
          }
    }
}
?>

    /* End of file hooks.php */
    /* Location: ./application/config/hooks.php */

用户['数据']未在所有页面中创建。我哪里错了?

4 个答案:

答案 0 :(得分:0)

关于退出的第二个问题,我通常会将logout函数放在User控制器中并将其称为<a href="<?php echo base_url().'user/logout';?>">Log Out</a>

对于您的第一个问题,我看到了一个教程,您将如何在控制器中进行用户登录并在常规控制器中扩展该控制器,这就是您如何避免在每个功能中进行登录检查。我试图找到那个教程,一旦我得到它,我将分享它,但概念就是这样。

答案 1 :(得分:0)

您不需要将session_start();放在每个控制器中!

您只需在autoload.php目录的config文件中启动会话类即可!

$autoload['libraries'] = array('database', 'session', 'encrypt');

此外,最好在类的构造函数内检查用户是否已登录!

if(!$this->session->userdata('logged_in'))
    redirect('loginController/loginFunction', 'refresh');

并在注销时销毁所有会话,您可以使用sess_destroy();

答案 2 :(得分:0)

初始化会话

要自动加载会话,请打开application/config/autoload.php文件,然后将要加载的项目添加到autoload数组中,以便:$autoload['libraries'] = array('session');哟不要使用session_start();和完全session_destroy();

要检查登录

使用Hooks来避免繁琐的代码应用,这是更好的做法。浏览页面底部并阅读 Hook Points ,以便您了解相关信息。这很容易!绝对学习钩子。

<强>注销

您回答explained here

答案 3 :(得分:0)

经过多次工作后,我通过登录检查解决了问题。

我没有使用钩子。我在核心文件夹中构建了一个MY_Controller,并在登录控制器的所有控制器中将其释放出来。

在MY_Controller中,我使用登录检查。

CodeIgniter核心控制器: https://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/