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

标签 php mysql codeigniter session

我已经为我的网站创建了注册和登录,并且所有验证都适用于注册和登录。用户提供有效凭据后,他/她将登录到成员(member)区,并显示一条欢迎消息,上面写着 Hello first_name last_name..基本上名字和姓氏是从数据库中获取的。

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

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

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

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

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

如果在数据库中找不到任何内容,他们将被重定向到网站登录页面。我想知道的是是否有更好的方法来做到这一点?我现在的做法是否足够安全?

下面是我的模型代码:

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

}

感谢您的所有建议。

更新

如何将它添加到我的模型中

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

这基本上将“logged_in”添加到我在数据库 session 中的用户数据中,值为“TRUE”。 在我的“成员(member)区” Controller 中,我编辑了 if 语句来表示:

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

如果该项目不存在“如果用户未登录则它不会存在”那么将返回 FALSE 并且用户将被重定向到登录页面

你怎么看?

或者我什至可以让 TRUE 成为 secret ,例如 dsb453rerfksdhbdsks322。随机的东西。

最佳答案

您已经说到要害了,但还有一种稍微更有效的方法。

以一种方式扩展基本 Controller (我相信最初由 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
}

扩展 Controller 会在构造函数中自动检查用户是否登录

至于如何,我可能会将 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 而不是库中。

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

Admin_Controller.php
MY_Controller.php
Public_Controller.php

关于php - 将特定页面限制为仅在 Codeigniter 中登录的用户的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3819275/

相关文章:

php - 我如何在我的数据库中插入或更新一个条目,如果更新我如何添加到现有值

php - 加入多对一

php - Codeigniter 3.1 - 获取数据库错误号

php - CodeIgniter 文件上传显示 "You did not select a file to upload"

php - mySQl,查询 : How to customize selection from database?

php - 当在同一域中打开两个浏览器选项卡时,JQuery Ajax 不起作用

MySQL 查询语法错误。尝试创建每日事件但简单查询出现语法错误

mysql - Group_concat() 削减一些行

mysql - 如何在联接中对值进行分组

codeigniter - 模式创建时的 Doctrine + CodeIgniter : after generate entities with namespace, "cannot redeclare class"