【问题标题】:Authentication with CodeIgniter - Additional Session Information使用 CodeIgniter 进行身份验证 - 附加会话信息
【发布时间】:2012-12-19 22:13:46
【问题描述】:

长期以来,我一直是stackoverflow的狂热读者,现在轮到我提问了。

我遵循http://net.tutsplus.com/tutorials/php/easy-authentication-with-codeigniter/ 教程并设法让它完美地为我自己工作,但是我需要稍微扩展系统。在验证用户后,我需要能够提取经过身份验证的人员的其他行字段并存储在会话变量中,以便在其他控制器中用于将信息发送回数据库。

例如,我想在会话变量 $f_name 中有一个,我需要他们的 $username。 我从高处到低处都找到了答案,但它们只是让我感到困惑。

我的模特:

class admin_model extends CI_Model {
 function __construct( )
 {

 }

 public function verify_user($user_id, $password)
 {
 $q = $this->db->where('user_id', $user_id)
 ->where('password', sha1($password))->limit(1)->get('users');

 if ( $q->num_rows > 0   ){
     return $q->row();
 }
return false;

}

}

我的控制器:

class admin extends CI_Controller {

function __construct()
{
parent:: __construct();
session_start();


}

public function index()
{
    if ( isset($_SESSION['user_id'])){
        redirect('welcome');
    }
    $this->load->library('form_validation');
    $this->form_validation->set_rules('user_id', 'User ID', 'required|min_length[8]');
    $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');

    if ($this->form_validation->run() !==false){
       $this->load->model('admin_model');
      $res = $this
          ->admin_model
          ->verify_user(
          $this->input->post('user_id'),
          $this->input->post('password')
      );
   if ($res !== false) {
    $_SESSION['user_id'] = $this->input->post('user_id');
    redirect ('welcome');
   }






    }

    $this->load->view('login_view');
}

public function logout(){

    session_destroy();
    redirect ('admin');
}
}

再次感谢大家,期待您的回答\建议

【问题讨论】:

  • 为什么不使用 CI 的数据库会话?这样您就可以在该表中查询相关数据。
  • 我是否有可能获得一个示例,说明如何使用 CI 的数据库会话实现我需要的功能?我还是 CI 新手
  • 你不需要任何东西,只需设置一个配置参数。当您获取会话元素时,所有查询都会自动处理 ($this->session->userdata('element'))
  • 我不太明白,能否请您提供更多详细信息?

标签: php codeigniter session authentication


【解决方案1】:

有几件事:
- admin_model 中的 __construct() 函数需要 parent::__construct (或者该函数可以被删除,因为它是空的)来继承代码点火器模型构造函数。
- 代码点火器和 PHP 会话是不同的。您正在使用 PHP 会话,这意味着您必须先调用 session_start(),然后才能在您希望访问会话数据的每个页面上发送任何输出。这也可以通过打开 session.autostart 为 php.ini 中的每个页面设置

如果您想使用代码点火器会话,请查看此处: http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

2012 年 12 月 21 日更新

尝试从返回的数据库行中设置会话变量:

$_SESSION['f_name'] = $res->f_name;$_SESSION['username'] = $res->username; 与您设置会话用户 ID 变量的位置相同。我假设您的数据库字段映射到您要用于 f_name 和 username 字段的字段。

【讨论】:

  • 感谢您的建议,我认为 parent::_construct 是我的错字。我仍然不能 100% 相信如何将原始信息从数据库行中获取到会话中。
  • 这并不能真正回答他的问题
  • 尝试从返回的数据库行设置会话变量:$_SESSION['f_name'] = $res->f_name;和 $_SESSION['username'] = $res->username;与您设置会话用户 ID 变量的位置相同。我假设您的数据库字段正在映射到您要用于 f_name 和 username 字段的字段。
  • @KenPloeger 如果您编辑您的实际答案,我可以删除我的反对票 :)
  • @KenPloeger 你的上一篇文章很有魅力。原始回复已被标记为答案。附注,我阅读了有关 CI 会话的链接,我有一个关于设置它的简单问题 $config['sess_use_database'] = TRUE;设置数据库,$f_name = $this->session->userdata('f_name');使它可用,让它存储的代码是什么 $_SESSION['f_name'] = $res->f_name;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 2022-01-16
  • 2015-03-16
  • 1970-01-01
  • 2021-10-11
  • 2013-12-29
相关资源
最近更新 更多