CodeIgniter 登录会话

Posted

技术标签:

【中文标题】CodeIgniter 登录会话【英文标题】:CodeIgniter login session 【发布时间】:2016-10-06 17:22:13 【问题描述】:

我是 CodeIgniter 的新手,我试图在我的网站上创建一个登录系统。当我尝试进入页面概览时,它会在登录页面上发送给我,但在我输入正确的电子邮件和密码后,什么也没有发生。

Login.php - 控制器

    <?php if ( ! defined('BASEPATH')) exit('No direct script access
allowed');
     class Login extends CI_Controller 
      function __construct()
      
        parent::__construct();
      

      function index()
      
        $this->load->helper(array('form'));
        $this->load->view('login');
      

     
    ?>

Overview.php - 控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Overview extends CI_Controller 

 function __construct()
 
   parent::__construct();
 

 function index()
 
   if($this->session->userdata('logged_in'))
   
     $session_data = $this->session->userdata('logged_in');
     $data['username'] = $session_data['username'];
     $this->load->view('overview', $data);
   
   else
   
     //If no session, redirect to login page
     redirect('login', 'refresh');
   
 

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



?>

VerifyLogin.php - 控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class VerifyLogin extends CI_Controller 

 function __construct()
 
   parent::__construct();
   $this->load->model('user','',TRUE);
 

 function index()
 
   //This method will have the credentials validation
   $this->load->library('form_validation');

   $this->form_validation->set_rules('email', 'E-mail', 'trim|required|xss_clean');
   $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');

   if($this->form_validation->run() == FALSE)
   
     //Field validation failed.  User redirected to login page
     $this->load->view('login');
   
   else
   
     //Go to private area
     redirect('home', 'refresh');
   

 

 function check_database($password)
 
   //Field validation succeeded.  Validate against database
   $username = $this->input->post('username');

   //query the database
   $result = $this->user->login($username, $password);

   if($result)
   
     $sess_array = array();
     foreach($result as $row)
     
       $sess_array = array(
         'id' => $row->id,
         'username' => $row->username
       );
       $this->session->set_userdata('logged_in', $sess_array);
     
     return TRUE;
   
   else
   
     $this->form_validation->set_message('check_database', 'Invalid username or password');
     return false;
   
 

?>

Login.php - 视图

<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4 well">
<form role="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="loginform">
<fieldset>
<legend>Login</legend>
<div class="form-group">
<label for="name">Email</label>
<input type="text" name="email" placeholder="Your Email" required class="form-control" />
</div>

<div class="form-group">
<label for="name">Password</label>
<input type="password" name="password" placeholder="Your Password" required class="form-control" />       
</div>

<div class="form-group">
<input type="submit" name="login" value="Login" class="btn btn-primary" />
</div>
</fieldset>
</form>
<span class="text-danger"><?php if (isset($errormsg))  echo $errormsg;  ?></span>
</div>
</div>

谢谢,我希望有人能给我一个解决方案。

【问题讨论】:

因为表单中的操作链接不断发布到 Login 控制器中的 index() 方法,该控制器仅显示登录表单。操作链接应发布到VerifyLogin 控制器。 你的控制器VerifyLogin.php应该只有第一个字母大写Verifylogin.php和class Verifylogin extends CI_Controller @wolfgang1983 我改变了它,它做同样的事情.. @TheDrot 我真的不明白我需要改变什么......对不起,也许你可以告诉我。谢谢! 【参考方案1】:

当您进入登录页面时,由于$_SERVER['PHP_SELF'],操作将是“Login.php”。

<form role="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="loginform"> 

$_SERVER["PHP_SELF"] 是一个超级全局变量,它返回当前执行脚本的文件名。

你需要把action改成VerifyLogin,这样当你提交表单时,Verifylogin.php中的index()方法就会执行。

<form role="form" action="VerifyLogin" method="post" name="loginform">

xss_clean 不再是表单验证的一部分,因此请将其删除。 XSS 清理应该用于输出而不是输入。

$this->form_validation->set_rules('email', 'E-mail', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database');

【讨论】:

感谢@TheDrot,一切正常,但它在登录页面上将我重定向,没有错误,而不是在概述页面上。我认为重定向是个问题.. @funkyz0r 所以将redirect('home', 'refresh'); 更改为redirect('overview', 'refresh');,无论您需要重定向到概览页面。 我改变了它,什么都没有……它让我发疯 @funkyz0r logged_in 数组是否存在于会话中? @funkyz0r 会话库是否正在自动加载?检查 application/config/autoload.php 文件并查看 $autoload['libraries'] 数组。

以上是关于CodeIgniter 登录会话的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 登录会话

如何在登录系统中使用会话并在codeigniter中实现注销

使用 CodeIgniter (3.1.0) 创建会话

我的 Codeigniter 会话一经创建就会自动过期

没有登录会话,任何人都无法访问 codeigniter 4 中的控制器

手动设置会话过期时间-CodeIgniter