2015-11-20 88 views
0

我的工作我的登录控制器上笨版本3.0.3和HMVC自定义错误消息不显示在重定向如果会议为止

当到管理仪表板在用户登录其设置会话令牌和然后重定向它的URL

http://localhost/projectname/admin/common/dashboard/?token=bf9691a625fbd0c3513ad822b0f76c6efb45e9b535c7b732d1ff006ce17f8734 

当会话过期重定向回管理页面并应登录页面上显示的消息。我 尝试设置$数据变量消息,而不是使用出于某种原因,闪存数据

当会话过期的和被重定向回管理员警告消息不会激活。

问题:为什么自定义数据消息在会话过期后不会显示,一旦重定向回管理员登录?

我也用笨钩子函数运行登录校验功能

控制器

文件名:login.php中

<?php 

defined('BASEPATH') OR exit('No direct script access allowed'); 

class Login extends MX_Controller { 

    private $error = array(); 

    public function index() { 
     $data['title'] = 'Administration'; 

     $data['heading_title'] = 'Administration'; 

     if (($this->input->server('REQUEST_METHOD') == 'POST') && $this->validate()) { 

      $this->load->library('encryption'); 

      $token = bin2hex($this->encryption->create_key(32)); 

      $this->session->set_userdata(array('token' => $token)); 

      redirect('admin/common/dashboard/?token=' . $token); 
     } 

     // Message Below Not Display On Login If Session Expire And Has Been Redirected Back To Admin 
     if ((isset($_SESSION['token']) && !isset($_GET['token'])) || ((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token']))))) { 
      $this->error['warning'] = 'Your Session Token Is Invalid!'; 
     } 

     if (isset($this->error['warning'])) { 
      $data['error_warning'] = $this->error['warning']; 
     } else { 
      $data['error_warning'] = ''; 
     } 

     $data['header'] = Modules::run('admin/common/header/index', $data); 
     $data['footer'] = Modules::run('admin/common/footer/index'); 

     $this->load->view('common/login', $data); 

    } 


    protected function validate() { 
     if (!isset($_POST['username']) || !isset($_POST['password']) || !$this->user->login($_POST['username'], html_entity_decode($_POST['password'], ENT_QUOTES, 'UTF-8'))) { 
      $this->error['warning'] = 'Incorrect Username Or Password!'; 
     } 

     return !$this->error; 
    } 

    public function check() { 
     $uri_route = $this->uri->segment(2) .'/'. $this->uri->segment(3); 

     $route = isset($uri_route) ? $uri_route : ''; 

     $ignore = array(
      'common/login', 
      'common/forgotten', 
      'common/reset' 
     ); 

     if (!$this->user->is_logged() && !in_array($route, $ignore)) { 
      redirect('admin/common/login'); 
     } 

     if (isset($route)) { 
      $ignore = array(
       'common/login', 
       'common/logout', 
       'common/forgotten', 
       'common/reset', 
       'error/not_found', 
       'error/permission' 
      ); 

      if (!in_array($route, $ignore) && (!isset($_GET['token']) || !isset($_SESSION['token']) || ($_GET['token'] != $_SESSION['token']))) { 
       redirect('admin/common/login'); 
      } 

     } else { 

      if (!isset($_GET['token']) || !isset($_SESSION['token']) || ($_GET['token'] != $_SESSION['token'])) { 
       redirect('admin/common/login'); 
      } 
     } 
    } 
} 

登录查看$ error_warning

<?php if ($error_warning) { ?> 
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?> 
<button type="button" class="close" data-dismiss="alert">&times;</button> 
</div> 
<?php } ?> 

挂钩

<?php 

$hook['pre_controller'] = array(
     'class' => 'Login', 
     'function' => 'check', 
     'filename' => 'Login.php', 
     'filepath' => 'modules/admin/controllers/common' 
); 

回答

1

因为你永远不设置讯息话题。您的会话已过期,而您的会话有两个部分。

第一部分:(isset($_SESSION['token']) && !isset($_GET['token'])):会话已过期,令牌不会话设置,所以第一个条件是假的。

而第二个健壮条件:((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token']))),即使令牌设置在$_GET阵列中,第二个条件永远不会为真,因为您的会话已过期,并且令牌未在会话中设置,和/或是不一样的到$_GET阵列中的令牌。

+0

@ wolfgang1983嘛,据我理解你的代码,如果你的会话令牌在'$ _SESSION'或不'$ _GET'没有设置,只是检查,如果这两个都设定,如果没有,错误。如果两者都设置,还要检查他们是一样的,如果你需要的逻辑。 – slax0r

相关问题