簡體   English   中英

僅在Codeigniter中將特定頁面限制為登錄用戶的最佳做法是什么?

[英]What is the best practice for restricting specific pages to logged in users only in 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概述),但我將在此總結:

請參閱此文章 ,深入了解。

但實質上:

<?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

我使用類似的東西:

    $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,並在需要時進行檢查。

我希望它有所幫助!

我不認為它是一個控制器工作來實現安全性,它應該只檢查它。 您可以將身份驗證邏輯編碼到庫中。 接下來,自動加載該庫。 在為受保護內容提供服務的控制器方法中,您可以簡單地執行以下操作:

$這 - > auth->限制();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM