php – 仅在Codeigniter中将特定页面限制为登录用户的最佳做法是什么?

前端之家收集整理的这篇文章主要介绍了php – 仅在Codeigniter中将特定页面限制为登录用户的最佳做法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我已经为我的网站创建了一个注册登录,所有验证都适用于注册登录.用户提供有效凭据后,他/她将使用欢迎消息登录到成员区域,该消息显示Hello first_name last_name ..基本上从数据库获取名字和姓氏.

我想做的任何方法是将成员区域限制为仅登录用户.其他任何人都将被重定向到主页或登录页面,或者我决定将其重定向到哪里.

我使用了ci_sessions,它存储在我的数据库中的表“ci_sessions”中. Session_id,ip_address,user_agent,last_activity和user_data是列.所以我猜这是某种形式的安全性,而不是单独存储在用户浏览器上的cookie还有更多.

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

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

这将检查尝试访问成员区页面的人是否在我的ci_sessions表中的user_data中存储了某种数据,例如first_name,如果允许,则允许他们访问该页面,这意味着他们必须已登录并仍然具有一个活跃的会议.

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

以下是我的型号代码

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);
    }

}

您的所有建议表示赞赏.

UPDATE

把它添加到我的模型怎么样

$CI->session->set_userdata('logged_in','TRUE');

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

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

}

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

你怎么看?

或者我甚至可以像dsb453rerfksdhbdsks322那样使其成为秘密.随机的东西.

最佳答案
你已经击中了头部,但是有一种更有效的方法.

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

请参阅this article以获得非常深入的写作.

但实质上:

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!
        }
    }
}

所以现在如果你想限制访问,只需:

class Secret_page extends MY_Controller {

 // your logged in specific controller code
}

并且扩展控制器将自动检查用户是否在构造函数登录.

至于如何,我可能会将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_Controllers放在Application / CORE而不是Libraries中.

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

Admin_Controller.PHP
MY_Controller.PHP
Public_Controller.PHP

猜你在找的MySQL相关文章