2011-12-04 43 views
5

好吧,我只是想在PHP中製作更鬆散耦合的類等,以提高我的技能。我的計算機上有一個本地測試數據庫,用戶表中有一個名爲「role」的列。我正在嘗試構建一個函數,該函數是獲取用戶權限的一般函數,因此不依賴於他們正在嘗試執行的特定任務。將權限存儲到多維數組中php

當用戶試圖做一些事情,如創建一個新的論壇主題等等,我想查詢數據庫,如果「角色」是一個特定的值,多維數組像下面的存儲權限:

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"), 
    'users' => array("edit", "lock") 
); 

然後,我希望能夠在用戶通過檢查isset($ var)發佈表單後在每個PHP文件的頂部鍵入以下內容來搜索特定權限的數組。因此,如果用戶試圖編輯一個用戶我希望能夠做這樣的事情通過,如果一個類的方法可能如下

if (Class::get_permissions($userID),array($permissionType=>$permission))) { 
    // do query 
} else { 
    // return error message 
} 

如何將有一個鬆散耦合的權限檢查功能,將一個好辦法能夠做到這樣的事情?它不必像這樣完全佈置,只是鬆散耦合,因此可以重複使用,而不受某些任務的束縛。但我希望能夠擁有一組權限,而不僅僅是「admin」,「user」等重用性,所以它不會限制我的選擇。因爲我現在在php腳本文件的頂部有一堆代碼。

if (Class::get_permissions($userID) == "admin") { 
    // allow query 
} else { 
    // return error 
} 

感謝您的任何意見,以幫助我得到這一點,我不會一直寫同樣的東西。

+0

Zend的ACL部分已經介紹了他們的acl工作方式:http://framework.zend.com/manual/en/zend.acl.introduction.html –

回答

3

你的問題有點含糊,但我會盡我所能。你說你將他們的權限存儲在一個數組$permissions

public static $permissions = array(); 

public static function setPermissions($perms) 
{ 
    if (!is_array($perms)) { 
     throw new Exception('$perms must be an array.'); 
    } 
    self::$permissions = $perms; 
} 

public static function hasPermission($section, $action) 
{ 
    if (array_key_exists($section, self::$permissions) 
     && in_array($action, self::$permissions[$section]) 
    ) { 
     return true; 
    } 

    return false; 
} 

根據這種邏輯,當你從數據庫中讀取用戶的權限,然後設置Class::$permissions靜止無功,像這樣:

Class::setPermissions($permissions); 
// ... 
if (Class::hasPermissions($page, $action)) { 
    // user has permission 
} 

注意,我的代碼是非常通用的,則要保持該直到我有更多的信息。現在,我假設您的權限數組正在使用頁面部分作爲索引,而數組是該頁面部分中用戶有權訪問的操作列表。因此,假設$page已被設置爲類似"forums",並且用戶正在嘗試執行編輯(因此$action = 'edit'),則Class::hasPermission()函數將返回true。

+0

感謝您的意見。有一個問題,但。這種方式好像我需要將數組存儲在$ _SESSION []變量中。這是我應該這樣做的方式嗎?林只是困惑我應該不應該放在$ _SESSION變量。謝謝! – vol4life27

2

我用盡了評論中的字符...但這是給您的評論。

@corey而不是有一個靜態對象,我包含一個函數,在用戶的會話中設置我的權限。它是我的LoginCommand類的一部分,顯然,當用戶登錄時會被調用。

然後將權限從視圖存儲到視圖中,而且我不必一直查詢。大多數事情的權限檢查只發生在用戶登錄時。但是,某些敏感的事情我會運行另一個查詢來進行仔細檢查。這具有的缺點是,如果用戶的權限在用戶擁有活動會話時發生更改,則這些更改不會推送給用戶。

記住要鍛鍊良好的會話安全性。 PHP Session Security

您不會在會話大小中存儲數據的唯一原因是因爲您的會話太大。但除非你的會話是兆字節,否則你可能不需要擔心這一點。

+0

所以只要每個用戶的會話變量小於兆字節,你的意思是?因此,如果我實際上想將用戶數據的6個字段(例如名字,姓氏,用戶名,用戶ID和電子郵件)作爲用戶對象存儲在$ _SESSION變量中,就可伸縮性而言,這完全可以嗎? – vol4life27

+0

是的。要獲得會話大小的近似值,請使用: $ size_of_session_estimate = strlen(serialize($ _SESSION)); 當你的會話變得太大時,有辦法動態設置你的會話保存路徑等。 我從來沒有見過某人的會話變得太大,但我從未在Facebook,亞馬遜等工作過。此外,投我的答案。 :) – phpmeh