Codeigniter - 如何避免用户在没有登录的情况下输入登录页面?

时间:2017-03-01 15:24:08

标签: php codeigniter session

如果真实用户将被定向到名为login.php的另一个控制器中的方法profile(),那么我将使用名为page.php的控制器来获取登录凭据。 在profile()方法中,只包含加载用户配置文件视图的命令。

所以路线是这样的:
主页 - >登录 - > profie
但是,当我试图通过这样的网址绕过登录过程时 主页 - >个人资料
系统仍然接受这一点。如果用户未登录,我该如何制定用户无法打开个人资料的规则?

这是控制器:

page.php文件     

class page extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('User_model', 'user_model', TRUE);
        $this->load->library('form_validation');    
        $this->form_validation->set_error_delimiters('<div class="error">', '</div>');
        $this->status = $this->config->item('status'); 
        $this->roles = $this->config->item('roles');
    }

    function index() {
        $this->load->view('page_header');
        $this->load->view('content_front');
        $this->load->view('page_footer');
    }


    function login() {
        $this->load->view('page_header');
        $this->load->view('content_login');
        $this->load->view('page_footer');
    }

    function register() {

       $this->load->view('page_header');
       $this->load->view('content_register');
       $this->load->view('page_footer');

   }  


    function profile(){

        $this->load->view('page_header');
        $this->load->view('content_profile');
        $this->load->view('page_footer');

    }

    function success() {
        $this->load->view('page_header');
        $this->load->view('content_success');
        $this->load->view('page_footer');
    }

    function logout()
    {
            //destroy session
        $data = array('login' => '', 'uname' => '', 'uid' => '');
        $this->session->unset_userdata($data);
        $this->session->sess_destroy();

        redirect('page/index');
    }


}


?>

的login.php

<?php

class Login extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->helper(array('form','url','html','security'));
        $this->load->library(array('session','form_validation'));
        $this->load->database();
        $this->load->model('user_model');
    }

    function index()
    {
        //get form input
        $username = $this->input->post('username');
        $password = $this->input->post('password');

        //form validation
        $this->form_validation->set_rules('username','username','trim|required|xss_clean');
        $this->form_validation->set_rules('password','Password','trim|required|xss_clean');

        if($this->form_validation->run() == FALSE)
        {
            //validation fail
            $this->load->view('content_login');
        }
        else
        {
            //check user credentials
            $uresult = $this->user_model->get_user($username, $password);
            if(count($uresult)>0)
            {
                //set session
                $sess_data = array('login' => TRUE, 'uname' => $uresult[0]->username,'uid' => $uresult[0]->id);
                $this->session->set_userdata($sess_data);
                $this->load->library('../controllers/page');
                $this->page->profile();
            }
            else
            {
                $this->session->set_flashdata('msg','<div class = "alert alert-danger text-center">Wrong Email/Password</div>');
                $this->load->library('../controllers/page');
                $this->page->login();

            }
        }
    }
}

?>

任何人都可以帮我解决这个问题吗? 谢谢。

7 个答案:

答案 0 :(得分:1)

为每个适用的控制器添加构造函数。 让构造函数检查用户是否已登录,可能通过检查特定会话是否存在。如果它没有重定向到登录页面。

如下所示

   function __construct(){
        parent::__construct();
        if(!$this->session->userdata('userid')){
            redirect('user/login');
        }
    }

答案 1 :(得分:1)

在页面顶部使用此功能,您希望在未登录时访问该页面(假设您已经设置了会话数据)

<?php if (!isset($_SESSION['username'])) {
    redirect(base_url());
} ?>

答案 2 :(得分:0)

在显示该页面之前,您应该检查该会话是否存在,例如if($this->session->userdata('username'))。如果存在,则显示该页面,如果没有显示任何警告。

答案 3 :(得分:0)

你可以尝试

if ($this->session->userdata('login') == true) {
   redirect('controller');
}

登录控制器

<?php

class Login extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->helper(array('form','url','html','security'));
        $this->load->library(array('session','form_validation'));
        $this->load->database();
        $this->load->model('user_model');
    }

    function index()
    {

     if ($this->session->userdata('login') == true) {
        redirect('controller');
      }
        //get form input
        $username = $this->input->post('username');
        $password = $this->input->post('password');

        //form validation
        $this->form_validation->set_rules('username','username','trim|required|xss_clean');
        $this->form_validation->set_rules('password','Password','trim|required|xss_clean');

        if($this->form_validation->run() == FALSE)
        {
            //validation fail
            $this->load->view('content_login');
        }
        else
        {
            //check user credentials
            $uresult = $this->user_model->get_user($username, $password);
            if(count($uresult)>0)
            {
                //set session
                $sess_data = array('login' => TRUE, 'uname' => $uresult[0]->username,'uid' => $uresult[0]->id);
                $this->session->set_userdata($sess_data);
                $this->load->library('../controllers/page');
                $this->page->profile();
            }
            else
            {
                $this->session->set_flashdata('msg','<div class = "alert alert-danger text-center">Wrong Email/Password</div>');
                $this->load->library('../controllers/page');
                $this->page->login();

            }
        }
    }
}

我在Codeigniter 3 +版本中注意到的一些事情,第一个字母在FILENAME和Controller Class上只能是大写

此外,您无需使用?> https://www.codeigniter.com/user_guide/general/styleguide.html#php-closing-tag

关闭控制器和型号

答案 4 :(得分:0)

例如,如果您不希望用户在没有登录的情况下输入功能,您可以在类的构造函数中检查会话。

如果它仅适用于特定功能,您也可以直接在功能中检查会话。

答案 5 :(得分:0)

创建一个帮助文件login_helper.php

function check_login( $session ) {
     $CI =& get_instance();
     $CI->load->helper('url');
     if(!$session->userdata('login')){
         redirect(base_url());
     }

}

现在在必须登录的控制器中使用此辅助功能

class page extends CI_Controller {

function __construct() {
    parent::__construct();
    $this->load->model('User_model', 'user_model', TRUE);
    $this->load->library('form_validation');    
    $this->form_validation->set_error_delimiters('<div class="error">', '</div>');
    $this->status = $this->config->item('status'); 
    $this->roles = $this->config->item('roles');
}

function index() {
    $this->load->view('page_header');
    $this->load->view('content_front');
    $this->load->view('page_footer');
}


function login() {
    $this->load->view('page_header');
    $this->load->view('content_login');
    $this->load->view('page_footer');
}

function register() {

   $this->load->view('page_header');
   $this->load->view('content_register');
   $this->load->view('page_footer');

}  


function profile(){
    check_login();
    $this->load->view('page_header');
    $this->load->view('content_profile');
    $this->load->view('page_footer');

}

function success() {
    $this->load->view('page_header');
    $this->load->view('content_success');
    $this->load->view('page_footer');
}

function logout()
{
        //destroy session
    $data = array('login' => '', 'uname' => '', 'uid' => '');
    $this->session->unset_userdata($data);
    $this->session->sess_destroy();

    redirect('page/index');
}


}
?>

注意:在config文件夹中的autoload.php中添加login_helper。

$autoload['helper'] = array('login','url','cookie');

答案 6 :(得分:0)

if($this->session->userdata('logged_in') == FALSE) {
            $this->session->set_flashdata('error','<p class="alert alert-danger">Please login to view this page.</p>');
            redirect('login_c');
            exit;

}