2011-12-04 17 views
5

में अनुमतियों को संग्रहीत करना ठीक है, मैं बस अपने कौशल में सुधार करने के लिए PHP में अधिक ढीले युग्मित कक्षाएं बनाने में बेहतर होने की कोशिश कर रहा हूं। मेरे पास मेरे कंप्यूटर पर स्थानीय परीक्षण डेटाबेस है और उपयोगकर्ता तालिका के लिए मेरे पास "भूमिका" नामक एक कॉलम है। मैं ऐसे फ़ंक्शन को बनाने का प्रयास कर रहा हूं जो उपयोगकर्ता के लिए अनुमतियां प्राप्त करने के लिए एक सामान्य कार्य है, इसलिए यह एक विशिष्ट कार्य पर निर्भर नहीं है जो वे करने का प्रयास कर रहे हैं।बहु आयामी सरणी php

एक उपयोगकर्ता इस तरह के एक नए मंच विषय आदि बनाने के लिए, मैं डेटाबेस क्वेरी करना चाहते हैं और के रूप में कुछ करने के लिए प्रयास करता है, तो "भूमिका" एक निश्चित मूल्य, निम्नलिखित की तरह एक बहुआयामी सरणी में दुकान अनुमतियाँ है:

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

तब मैं उस सरणी को प्रत्येक PHP फ़ाइल के शीर्ष पर निम्न टाइप किए बिना किसी विशिष्ट अनुमति के लिए खोज करने में सक्षम होना चाहता हूं, जब उपयोगकर्ता जारीकर्ता ($ var) की जांच करके फ़ॉर्म पोस्ट करता है। तो अगर उपयोगकर्ता एक उपयोगकर्ता को संपादित करने की कोशिश कर रहा है मैं अगर एक वर्ग विधि संभव के माध्यम से निम्नलिखित की तरह कुछ करने के लिए सक्षम होना चाहते हैं

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

कैसे एक शिथिल युग्मित अनुमति जाँच समारोह है कि होगा करने के लिए एक अच्छा तरीका हो सकता है ऐसा कुछ करने में सक्षम हो? इसे बिल्कुल इस तरह से बाहर नहीं रखा जाना चाहिए, लेकिन केवल थोड़ी सी युग्मित होनी चाहिए ताकि इसे पुन: उपयोग किया जा सके और किसी निश्चित कार्य से बंधे न हो। लेकिन मैं पुन: प्रयोज्यता के लिए केवल "व्यवस्थापक", "उपयोगकर्ता" आदि की बजाय अनुमतियों की एक सरणी प्राप्त करने में सक्षम होना चाहता हूं और इसलिए यह मेरे विकल्पों को सड़क के नीचे सीमित नहीं करता है। क्योंकि मेरे पास कोड का एक गुच्छा है जो अभी मेरी PHP स्क्रिप्ट फ़ाइलों के शीर्ष पर है।

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

मुझे यह जानने में मदद करने के लिए किसी भी इनपुट के लिए धन्यवाद जहां मैं वही सामान लिखना जारी नहीं रखता हूं।

+0

ज़ेंड के एसीएल अनुभाग में उनके एसीएल के काम में ठीक परिचय दिया गया है: http://framework.zend.com/manual/en/zend.acl.introduction.html –

उत्तर

3

आपका प्रश्न थोड़ा अस्पष्ट है, लेकिन मैं अपनी पूरी कोशिश करूंगा। आपने कहा है कि आप एक सरणी $permissions में अपनी अनुमतियां संग्रहीत कर रहे हैं।

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

ध्यान दें, मेरी कोड बहुत सामान्य है और वह रहने के लिए करना होगा:

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 स्थिर वर सेट जब तक मेरे पास अधिक जानकारी न हो। अभी के लिए, मुझे लगता है कि आपकी अनुमतियां सरणी एक पृष्ठ अनुभाग का उपयोग कर रही है क्योंकि इंडेक्स और सरणी उस पृष्ठ अनुभाग के भीतर कार्रवाइयों की एक सूची है जिस पर उपयोगकर्ता तक पहुंच है। इसलिए, $page को "forums" जैसे कुछ पर सेट किया गया है और उपयोगकर्ता वर्तमान में एक संपादन करने की कोशिश कर रहा है (इसलिए $action = 'edit'), Class::hasPermission() फ़ंक्शन सत्य वापस आ जाएगा।

+0

इनपुट के लिए धन्यवाद। हालांकि एक सवाल है। इस तरह लगता है कि मुझे सरणी को $ _SESSION [] चर में संग्रहीत करने की आवश्यकता है। क्या मुझे ऐसा करना चाहिए? मैं सिर्फ इस बात पर भ्रमित हूं कि मुझे क्या करना चाहिए और $ _SESSION चर में नहीं डालना चाहिए। धन्यवाद! – vol4life27

2

मैं टिप्पणियों में पात्रों से बाहर भाग गया ... लेकिन यह आपकी टिप्पणी के लिए है।

स्थिर वस्तु रखने के बजाय @corey, मैं एक ऐसा फ़ंक्शन शामिल करता हूं जो उपयोगकर्ता के सत्र में मेरी अनुमतियां सेट करता है। यह मेरे लॉगिन कॉमांड क्लास के हिस्से के रूप में होता है जिसे स्पष्ट रूप से उपयोगकर्ता लॉग इन करते समय बुलाया जाता है।

अनुमतियों को देखने के लिए दृश्य से संग्रहीत किया जाता है और मुझे क्वेरीिंग रखने की आवश्यकता नहीं है। अधिकांश चीजों के लिए अनुमतियां केवल तभी होती हैं जब उपयोगकर्ता लॉग इन करता है। हालांकि, कुछ संवेदनशील चीजें मैं दोबारा जांच करने के लिए एक और क्वेरी चलाऊंगा। इसका नुकसान यह है कि, यदि उपयोगकर्ता के सक्रिय सत्र होने पर उपयोगकर्ता की अनुमतियां बदलती हैं, तो ये परिवर्तन उपयोगकर्ता को नहीं धकेल दिए जाएंगे।

अच्छी सत्र सुरक्षा का अभ्यास करना याद रखें। PHP Session Security

एकमात्र कारण है कि आप अपने सत्र आकार में डेटा स्टोर नहीं करेंगे क्योंकि आपका सत्र बहुत बड़ा हो गया है। लेकिन जब तक आप सत्र मेगाबाइट नहीं करते हैं, तो आपको शायद इसके बारे में चिंता करने की आवश्यकता नहीं है।

+0

ताकि जब तक प्रत्येक उपयोगकर्ता का सत्र चर एक मेगाबाइट से कम हो, तो आपका मतलब है? इसलिए यदि मैं वास्तव में उपयोगकर्ता नाम के रूप में $ _SESSION वैरिएबल में पहले नाम, अंतिम नाम, उपयोगकर्ता नाम, उपयोगकर्ता आईडी और ईमेल जैसे उपयोगकर्ता डेटा के लगभग 6 फ़ील्ड स्टोर करना चाहता था, तो स्केलेबिलिटी के संबंध में यह बिल्कुल ठीक होगा? – vol4life27

+0

हां। सत्र आकार का अनुमान प्राप्त करने के लिए, उपयोग करें: $ size_of_session_estimate = strlen (serialize ($ _SESSION)); बिंदु पर आपके सत्र बहुत बड़े हो जाते हैं, आपके सत्र को बचाने के पथ को गतिशील रूप से सेट करने के तरीके हैं। मैंने कभी किसी के सत्र को बहुत बड़ा नहीं देखा है, लेकिन मैंने कभी फेसबुक, अमेज़ॅन आदि पर काम नहीं किया है ... इसके अलावा, मेरे जवाब को वोट दें। :) – phpmeh

संबंधित मुद्दे