Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将特定页面限制为仅在Codeigniter中登录的用户的最佳实践是什么?_Php_Mysql_Codeigniter_Session - Fatal编程技术网

Php 将特定页面限制为仅在Codeigniter中登录的用户的最佳实践是什么?

Php 将特定页面限制为仅在Codeigniter中登录的用户的最佳实践是什么?,php,mysql,codeigniter,session,Php,Mysql,Codeigniter,Session,我已经为我的网站创建了一个注册和登录,所有的注册和登录验证工作都很好。用户提供有效凭据后,他/她将登录到成员区域,并收到一条欢迎消息,该消息中表示“Hello first\u name last\u name…”。。基本上,名字和姓氏都是从数据库中获取的 我想做的任何事情都是将成员区域限制为仅登录用户。其他人将被重定向到主页或登录页面,或者我决定他们应该重定向到的任何地方 我使用的ci_会话存储在数据库中的“ci_会话”表中。会话id、ip地址、用户代理、上次活动和用户数据列。因此,我想这是某种

我已经为我的网站创建了一个注册和登录,所有的注册和登录验证工作都很好。用户提供有效凭据后,他/她将登录到成员区域,并收到一条欢迎消息,该消息中表示“Hello first\u name last\u name…”。。基本上,名字和姓氏都是从数据库中获取的

我想做的任何事情都是将成员区域限制为仅登录用户。其他人将被重定向到主页或登录页面,或者我决定他们应该重定向到的任何地方

我使用的ci_会话存储在数据库中的“ci_会话”表中。会话id、ip地址、用户代理、上次活动和用户数据列。因此,我想这是某种形式的安全性,而不仅仅是在用户浏览器上存储cookie,还有更多

无论如何,现在阻止除登录用户之外的任何其他人访问我的网站成员区域,例如,我在控制器中为成员区域使用一个简单的if语句:

if (! $this->session->userdata('first_name'))
    {
    redirect('login');
}
这将检查试图访问“成员区域”页面的用户是否在“我的ci_会话”表的“用户_数据”中存储了某种类型的数据,例如第一个_名称,如果是,则允许他们访问该页面,这意味着他们必须已登录并且仍有活动会话

如果在数据库中找不到任何内容,则会将其重定向到网站登录页面。我想知道的是有没有更好的方法?我现在这样做安全吗

以下是我的型号代码:

<?php
class Current_User {

    private static $user;

    private function __construct() {}

    public static function user() {

        if(!isset(self::$user)) {

            $CI =& get_instance();
            $CI->load->library('session');

            if (!$user_id = $CI->session->userdata('user_id')) {
                return FALSE;
            }

            if (!$u = Doctrine::getTable('User')->find($user_id)) {
                return FALSE;
            }

            self::$user = $u;
        }

        return self::$user;
    }


    public static function login($email, $password) {

        // get User object by email
        if ($u = Doctrine::getTable('User')->findOneByEmail($email)) {


            // to ge the mutated version of the input password
            $u_input = new User();
            $u_input->password = $password;

            // password match
            if ($u->password == $u_input->password) {


                $CI =& get_instance();
                $CI->load->library('session');
                $CI->session->set_userdata('user_id',$u->id);
                $CI->session->set_userdata('username',$u->username);
                $CI->session->set_userdata('first_name',$u->first_name);
                $CI->session->set_userdata('last_name',$u->last_name);

                self::$user = $u;

                return TRUE;
            }

            unset($u_input);
        }

        // login failed
        return FALSE;

    }


    public function __clone() {
        trigger_error('No duplicates allowed.', E_USER_ERROR);
    }

}
这基本上是将“logged_in”添加到数据库会话中的用户数据中,值为“TRUE”。 在我的“成员区”控制器中,我编辑了if语句,以说明:

if (! $this->session->userdata('logged_in')==TRUE)
{
redirect('login');
}

如果该项目不存在“如果用户未登录,它将不存在”,则返回FALSE,用户将重定向到登录页面

你觉得怎么样


或者我甚至可以实现一些秘密,比如DSB453RERFKSHDSBDSKS322。一些随机的东西。

你已经一针见血了,但是有一种更有效的方法

以一种方式扩展基本控制器(我相信最初由Phil Sturgeon概述),但我将在这里总结:

请参阅一篇非常深入的评论

但本质上:

<?php
class MY_Controller extends Controller
{
    function __construct()
    {
        parent::Controller();
        if (! $this->session->userdata('first_name'))
        {
            redirect('login'); // the user is not logged in, redirect them!
        }
    }
}
扩展控制器将自动检查用户是否登录到构造函数中

至于如何设置,我可能会将user_id设置为值,以检查其设置或用户“组”——然后您可以在系统中获得用户权限和不同的访问级别

希望这有点帮助

编辑

将其添加到application/config.php

/*
| -------------------------------------------------------------------
|  Native Auto-load
| -------------------------------------------------------------------
| 
| Nothing to do with cnfig/autoload.php, this allows PHP autoload to work
| for base controllers and some third-party libraries.
|
*/
function __autoload($class)
{
    if(strpos($class, 'CI_') !== 0)
    {
        @include_once( APPPATH . 'core/'. $class . EXT );
    }
}
在使用CI 2.0时,需要将MY_控制器放置在应用程序/核心中,而不是库中

我的应用程序/核心看起来有点像:

Admin_Controller.php
MY_Controller.php
Public_Controller.php
我用的是:

    $user_session = $this->model_user_lite->Session_Check();
    if ( $user_session == FALSE )
    {
        redirect('main/about');
        exit();
    }
    $data['auth'] = $user_session;
    $user_id = $this->model_user_lite->Session_UserID ();
保护的不是控制器,而是功能本身,我认为这更有效。 代码可以很好地自我解释,但是我也对会话进行了检查:

function Session_Check ( $return_link = FALSE )
{

    $auth   = $this->session->userdata('logged_in');
    if ( $auth == FALSE )
    {
        $return_value = FALSE;
    }
    else
    {
        $return_value = TRUE;
    }

    return $return_value;

}
因此,在用户登录的地方,我们只需将userdata“logged_in”设置为TRUE,并随时检查它


我希望有帮助

我认为实现安全性不是控制器的工作,它应该检查一下。您可以将身份验证逻辑编码到库中。接下来,自动加载该库。在为受保护内容提供服务的控制器方法中,您可以简单地执行以下操作:


$this->auth->restrict()

是的,非常感谢。我将阅读Phil Sturgeon的文章,以便更好地理解。我注意到的另一件事是,即使我没有登录会话id,数据库中也会存储/更新用户代理、ip、最后一次活动。现在我可以想象数百万人在没有登录的情况下浏览这个网站。这不好吗?它不应该只记录登录用户的信息吗?如果没有,我是否有办法让它销毁此数据,或者在用户未登录时根本不记录它?致命错误:在中找不到类“MY_Controller”。。。我认为这是一个CodeIgnite2.0Bugnada,你需要利用PHP5s的自动加载魔法。见我编辑的帖子
    $user_session = $this->model_user_lite->Session_Check();
    if ( $user_session == FALSE )
    {
        redirect('main/about');
        exit();
    }
    $data['auth'] = $user_session;
    $user_id = $this->model_user_lite->Session_UserID ();
function Session_Check ( $return_link = FALSE )
{

    $auth   = $this->session->userdata('logged_in');
    if ( $auth == FALSE )
    {
        $return_value = FALSE;
    }
    else
    {
        $return_value = TRUE;
    }

    return $return_value;

}