Php CodeIgniter中的登录过程是否良好?

Php CodeIgniter中的登录过程是否良好?,php,codeigniter,login,Php,Codeigniter,Login,我正在CodeIgniter中创建我的第一个登录过程。 我正在使用simpleloginsecure库进行实际的会话管理,但我自己编写了控制器和模型,我希望您能看到其中的任何缺陷 我的用户模型类 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class User_model extends CI_Model { public function __con

我正在CodeIgniter中创建我的第一个登录过程。 我正在使用simpleloginsecure库进行实际的会话管理,但我自己编写了控制器和模型,我希望您能看到其中的任何缺陷

我的用户模型类

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

    class User_model extends CI_Model {
        public function __construct() {
            parent::__construct();
        }

        function login($email, $password) {
            if($this->simpleloginsecure->login($email, $password)) {
                return true;
            }
            return false;
        }
    } 

    ?>

我的用户控制器类
if(!defined('BASEPATH')) exit('No Direct script access allowed');

Class User extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('user_model');
    }

    public function index() {
        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            $this->load->view('user/login', $data);
        }
    }

    public function dashboard() {
        if($this->session->userdata('logged_in')) {
            $data['title'] = 'Welcome';
            $this->load->view('user/dashboard', $data);
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            redirect('/user/login/', 'location');
        }

    }

    public function login() {

        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        }

        $this->form_validation->set_rules('email', 'E-mail', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', 'Wachtwoord', 'trim|required|min_length[4]|max_length[32]');

        if($this->form_validation->run() == FALSE) {
            $this->index();
        } else {
            if($this->user_model->login($this->input->post('email'), $this->input->post('password'))) {
                redirect('/user/dashboard/', 'location');
            } else {
                $this->index();
            }
        }
    }

    public function logout() {
        $this->simpleloginsecure->logout();
        redirect('/user/login/', 'location');
    }



}
如果(!defined('BASEPATH'))退出('No Direct script access allowed');
类用户扩展CI_控制器{
公共函数构造(){
父项::_构造();
$this->load->model('user_model');
}
公共职能指数(){
如果($this->session->userdata('logged_in')){
重定向(“/user/dashboard/”,“location”);
}否则{
$data['message']='

您需要登录才能查看管理区域

'; $this->load->view('user/login',$data); } } 公共功能仪表板(){ 如果($this->session->userdata('logged_in')){ $data['title']='Welcome'; $this->load->view('user/dashboard',$data); }否则{ $data['message']='

您需要登录才能查看管理区域

'; 重定向(“/user/login/”,“location”); } } 公共函数登录(){ 如果($this->session->userdata('logged_in')){ 重定向(“/user/dashboard/”,“location”); } $this->form_validation->set_规则('email'、'E-mail'、'trim | required | valid_email'); $this->form_validation->set_规则('password'、'Wachtwoord'、'trim | required | min|u length[4]| max|u length[32]); 如果($this->form\u validation->run()==FALSE){ $this->index(); }否则{ 如果($this->user\u model->login($this->input->post('email'),$this->input->post('password')){ 重定向(“/user/dashboard/”,“location”); }否则{ $this->index(); } } } 公共功能注销(){ $this->simpleloginsecure->logout(); 重定向(“/user/login/”,“location”); } }
这是一个良好的开端,尽管如果创建两种类型的基本控制器类,一种是不安全的控制器,另一种是安全的控制器,可能有助于减少控制器索引函数中的代码重复

if(!defined('BASEPATH')) exit('No Direct script access allowed');

Class User extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('user_model');
    }

    public function index() {
        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            $this->load->view('user/login', $data);
        }
    }

    public function dashboard() {
        if($this->session->userdata('logged_in')) {
            $data['title'] = 'Welcome';
            $this->load->view('user/dashboard', $data);
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            redirect('/user/login/', 'location');
        }

    }

    public function login() {

        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        }

        $this->form_validation->set_rules('email', 'E-mail', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', 'Wachtwoord', 'trim|required|min_length[4]|max_length[32]');

        if($this->form_validation->run() == FALSE) {
            $this->index();
        } else {
            if($this->user_model->login($this->input->post('email'), $this->input->post('password'))) {
                redirect('/user/dashboard/', 'location');
            } else {
                $this->index();
            }
        }
    }

    public function logout() {
        $this->simpleloginsecure->logout();
        redirect('/user/login/', 'location');
    }



}
在安全控制器检查构造函数中的有效登录名的情况下,允许加载不安全控制器而不进行身份验证。因此,您的安全控制器的基类可能有以下内容:

Class Secure_Controller extends CI_Controller {

public function __construct() {
    parent::__construct();
    if(!$this->session->userdata('logged_in')) {
        $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
        $this->load->view('user/login', $data);
    }
}
类安全\u控制器扩展CI\u控制器{
公共函数构造(){
父项::_构造();
如果(!$this->session->userdata('logged_in')){
$data['message']='

您需要登录才能查看管理区域

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

然后,任何扩展Secure_Controller的类都将在继续之前自动检查身份验证。我没有尝试运行此代码,只是以您的起点为例,将身份验证集成到的构造函数中,以最大限度地减少所有控制器索引函数中的代码重复。

这是一个良好的开端,al尽管如果创建两种类型的基本控制器类,一种是不安全的控制器,另一种是安全的控制器,可能有助于减少控制器索引函数中的代码重复

if(!defined('BASEPATH')) exit('No Direct script access allowed');

Class User extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('user_model');
    }

    public function index() {
        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            $this->load->view('user/login', $data);
        }
    }

    public function dashboard() {
        if($this->session->userdata('logged_in')) {
            $data['title'] = 'Welcome';
            $this->load->view('user/dashboard', $data);
        } else {
            $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
            redirect('/user/login/', 'location');
        }

    }

    public function login() {

        if($this->session->userdata('logged_in')) {
            redirect('/user/dashboard/', 'location');
        }

        $this->form_validation->set_rules('email', 'E-mail', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', 'Wachtwoord', 'trim|required|min_length[4]|max_length[32]');

        if($this->form_validation->run() == FALSE) {
            $this->index();
        } else {
            if($this->user_model->login($this->input->post('email'), $this->input->post('password'))) {
                redirect('/user/dashboard/', 'location');
            } else {
                $this->index();
            }
        }
    }

    public function logout() {
        $this->simpleloginsecure->logout();
        redirect('/user/login/', 'location');
    }



}
如果安全控制器检查构造函数中的有效登录名,则允许在未经身份验证的情况下加载不安全控制器。因此,您的安全控制器基类可能有以下内容:

Class Secure_Controller extends CI_Controller {

public function __construct() {
    parent::__construct();
    if(!$this->session->userdata('logged_in')) {
        $data['message'] = '<p class="error">You need to be logged in to view the administration area</p>';
        $this->load->view('user/login', $data);
    }
}
类安全\u控制器扩展CI\u控制器{
公共函数构造(){
父项::_构造();
如果(!$this->session->userdata('logged_in')){
$data['message']='

您需要登录才能查看管理区域

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

然后,任何扩展Secure_Controller的类都将在继续之前自动检查身份验证。我没有尝试运行此代码,只是以您的起点为例,将身份验证集成到的构造函数中,以最大限度地减少所有控制器索引函数中的代码重复。

很有趣,但不会是重复代码吗?在OP的示例中,他有一个
User
类。如果三个方法中的一个不需要身份验证怎么办?有效点。我的假设是,该类的所有方法都需要身份验证。如果不是这样,您仍然需要继承不安全的基本控制器,并且只向该方法添加身份验证检查需要。很有趣,但这不是重复的代码吗?在OP的示例中,他有一个
User
类。如果三个方法中的一个不需要身份验证怎么办?有效点。我的假设是该类的所有方法都需要身份验证。如果不是这样,您仍然需要继承不安全的基本控制器和仅将身份验证检查添加到所需的方法。这可能更适合于感谢您的提示,我将在codereview交叉发布。这可能更适合于感谢您的提示,我将在codereview交叉发布。