0

我正在使用Codeigniter 版本 3.0.3 和 HMVC开发我的登录控制器

当用户登录到管理仪表板时,它会设置一个会话令牌,然后将其重定向到 url

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

当会话到期时,它会重定向回管理页面,并且应该在登录页面上显示消息。我正在尝试设置$data 变量消息而不是使用闪存数据

由于某种原因,当会话过期并被重定向回管理员时,警告消息不会激活。

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

我还使用 codeigniter 钩子函数来运行登录检查功能

控制器

文件名:登录.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'
);
4

1 回答 1

1

因为你从来没有设置过那个信息。您的会话已过期,您的 if 有两个部分。

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

第二个强大的条件:((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token'])))即使在$_GET数组中设置了令牌,第二个条件也永远不会为真,因为您的会话已过期,并且令牌未在会话中设置,和/或与$_GET数组中的令牌。

于 2015-11-20T07:57:03.803 回答