2011-09-20 17 views
5

मैं एक ऐसी प्रणाली का निर्माण कर रहा हूं जहां संगठन अपने व्यापार से संबंधित जानकारी दर्ज करेंगे। रिपोर्टिंग को कई स्तरों पर उपयोगकर्ताओं के लिए उपलब्ध होना आवश्यक है जहां कुछ उपयोगकर्ताओं को केवल उनके संगठन के आंकड़ों तक पहुंच होगी और उच्च स्तर के उपयोगकर्ताओं को व्यक्तिगत संगठन के आंकड़ों और उच्च स्तर पर इकाइयों के लिए कुल आंकड़ों तक पहुंच होगी (मेरे चित्र को चित्रित करें जो चित्रित करता है पदानुक्रम)।पदानुक्रम के साथ उपयोगकर्ता अनुमतियों का प्रबंधन

Example hierarchy

  • एक नगर पालिका में एक या अधिक संगठनों होगा।
  • वहाँ एक काउंटी में एक या अधिक नगर पालिकाओं हो जाएगा
  • वहाँ एक राज्य में एक या अधिक काउंटियों
  • वहाँ एक या अधिक राज्यों
  • संगठनों, नगर पालिकाओं, काउंटियों, और राज्यों जोड़ा जा सकता है हो जाएगा हो जाएगा किसी भी समय
  • जब एक संगठन, नगर पालिका, काउंटी, सिस्टम में जोड़ा जाता है, जिस उपयोगकर्ता को पहले से ही उस राज्य को देखने की अनुमति है, उसे स्वचालित रूप से नए संगठन/नगर पालिका/काउंटी के लिए रिपोर्ट देखने में सक्षम होना चाहिए, बिना किसी व्यवस्थापक के स्पष्ट रूप से उन्हें अनुमति दें। वही उन उपयोगकर्ताओं पर लागू होना चाहिए जिनके पास नगरपालिका और काउंटी स्तर पर रिपोर्ट देखने की अनुमति है जब भी पदानुक्रम में उनके नीचे एक नई इकाई सिस्टम में जोड़ दी जाती है।

कुछ उदाहरण:

उपयोगकर्ता 1: केवल संगठन # के लिए रिपोर्ट देख सकता हूँ 1

उपयोगकर्ता 2: नगर पालिका # तहत सभी संगठनों के लिए रिपोर्ट देख सकता हूँ 2

उपयोगकर्ता 3: नगर पालिकाओं के तहत सभी संगठनों के लिए रिपोर्ट देख सकते हैं ## 2

उपयोगकर्ता 4: काउंटी # तहत सभी संगठनों के लिए रिपोर्ट देख सकता हूँ 3

उपयोगकर्ता 5: राज्य # तहत सभी प्रान्तों के लिए रिपोर्ट 3

मेरा प्रश्न कैसे है मैं इस व्यवस्थित करूँ देख सकता हूँ? मैं अलग-अलग संगठनों को अनुमति दिए बिना रिपोर्ट को अनुमतियां असाइन करने का सबसे अच्छा तरीका अनिश्चित हूं। यह स्पष्ट रूप से व्यावहारिक नहीं है।

मैंने यहां कुछ प्रश्न देखे हैं जो एसीएल से निपटते हैं लेकिन वे इस पर लागू नहीं होते हैं। यदि ऐसा होता है, तो यह एसीएल से कैसे संबंधित होगा इसका एक स्पष्टीकरण भी एक संतोषजनक उत्तर होगा।

उत्तर

1

मैं सोच रहा हूँ एक तरीका है कि है कि आप प्रत्येक इकाई के लिए एक अनूठा अनुमति आईडी assing (oranisation, नगर पालिका, काउंटी, राज्य)

तो अपने टेबल एक नया स्तंभ निम्नलिखित फार्म के साथ permission_id होना चाहिए: संगठन 1 O1 संगठन 2 permission_id होगा अनुमति आईडी O2

नगर पालिका 1 ही होगी अनुमति आईडी एम 1 नगर पालिका 2 अनुमति आईडी M2

और इतने पर होगा।

उसके बाद, आप एक अनुमति तालिका (आईडी, id_user, अनुमतियाँ) जहां अनुमतियाँ स्तंभ की तरह कुछ हो जाएगा कर सकते हैं O1 - permisssion केवल Organisation1 एम 1 के लिए - नगर पालिका में सभी संगठनों के लिए अनुमति 1 M1M2 - के लिए अनुमति नगर पालिकाओं 1 और 2

एस 1 में सभी संगठनों - राज्य 1

के लिए अनुमति यह सिर्फ मेरी राय है। जब तक आप जानते हैं कि किसी उपयोगकर्ता के पास नगर पालिका तक पहुंच है, तो उसे उस नगर पालिका के तहत सबकुछ तक पहुंच प्राप्त करनी चाहिए। कुछ php फ़ंक्शन जो वर्तमान इकाई से मार्ग प्राप्त कर सकते हैं उपयोगकर्ता अनुमति से मेल खा सकते हैं।

उदाहरण।

आप एक नगर पालिका पृष्ठ पर हैं। M2। ऐसे उपयोगकर्ता के साथ जिसके पास S2 की अनुमति है, आपके funcction को नगर पालिका आईडी के रूप में तर्क मिलेगा और फ़ंक्शन एक मार्ग बनाएगा: एम 2, सी 3, एस 1। आप S1 के साथ S2 की तुलना करते हैं और अनुमति अस्वीकार कर दी जाती है। इस तरह, जटिलता ओ (एन) है जहां एन इकाइयों की संख्या (orgs, नगर पालिकाओं, काउंटी और राज्यों, 4 है)।

4

मैं आपके डेटाबेस में उपयोगकर्ता समूहों की एक श्रृंखला बनाने का सुझाव दूंगा, जिनमें से प्रत्येक के भीतर एक या अधिक उपयोगकर्ता खाता स्तर हैं, फिर समूह के लिए पदानुक्रमित मूल्य के रूप में एक पूर्णांक असाइन करना, फिर व्यक्तिगत खाते के लिए ऐसा करना (InnoDB यह एक संबंधपरक संरचना है का उपयोग करें) समूह के भीतर स्तर, कुछ इस तरह:

table: account_groups (Broader account groupings) 
Fields: 
-id_key - primary key, auto number 
-group - unique index 
-parent - index, foreign key=account_groups.group (this allows you to create group trees, so you can specify that a county group belongs to a state, and a municipality belongs to a county group, etc.) 
-group_hierarchy - integer (0 is highest permission group, each subsequent one step lower) 

table: account_levels (Account levels within a group) 
Fields: 
-id_key - primary key, auto number 
-account_level - unique index 
-group - index, foreign key=account_groups.group 
-account_heirarchy - integer (same as other table but denotes heirarchy within the group 

table: user_accounts (Individual user accounts) 
Fields: 
-id_key - primary key, auto number 
-account_id - unique index, user account name 
-account_level - index, foreign key=account_levels.account_level 

table: user_groups (denotes which tree(s) the user has access to) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-group - index, foreign key=account_groups.group 

और फिर अनुमतियों के लिए:

table: permissions (directory of permissions that could be applied) 
Fields: 
-id_key - primary key, auto number 
-permission - unique index, permission identifier 
-other stuff you need associated with the individual permissions, based on how you want them to hook into your program 

table: permissions_group_permissions (permissions applied at group level) 
Fields: 
-id_key - primary key, auto number 
-group - index, foreign key=account_groups.group 
-permission - index, foreign key= permissions.permission 

table: permissions_account_permissions (permissions applied at account level) 
Fields: 
-id_key - primary key, auto number 
-account_type - index, foreign key=account_levels.account_level 
-permission - index, foreign key=permissions.permission 

table: permissions_individual_permissions (permissions applied to individual accounts, if neccessary) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-permission - index, foreign key=permissions.permission 
-allow_or_deny - boolean (TRUE means permission is granted, FALSE means permission if revoked. This allows you to fine tune individual accounts, either granting custom elevated permissions, or revoking individual permissions for troublesome accounts without demoting them from the group. This can be useful in some special circumstances) 
-expiration - timestamp (allows you to set expiration dates for permissions, like if you want to temporarily suspend a specific action. Programmatically set default value of 00/00/00 00:00:00 as indefinite. You can do this at the account and group levels too by adding this field to those tables.) 

फिर आप के लिए अनुमतियों के माध्यम से पुनरावृति करने के लिए php का उपयोग कर सकते फाई द्वारा व्यक्तिगत खाता समूह स्तर से जुड़े समूह को प्राप्त करना, पदानुक्रमित क्रम में प्रत्येक अनुवर्ती समूह की सरणी बनाना, और फिर समूह के भीतर चालू खाता स्तर से वर्तमान समूह (समूह सरणी में बहुआयामी सरणी के रूप में जोड़ें) के लिए पदानुक्रमित क्रम के माध्यम से पुनरावृत्ति करना समूह के भीतर अंतिम मौजूदा खाता स्तर पर। इसके बाद आप प्रत्येक अनुवर्ती समूह के लिए सभी खाता स्तर ले लेंगे और आखिरकार सरणी में जोड़े गए प्रत्येक खाता स्तर के लिए सभी संबंधित अनुमतियां प्राप्त करेंगे। यदि आप व्यक्तिगत उपयोगकर्ता अनुमतियों को लागू करते हैं, तो आपको व्यक्तिगत रूप से लागू अनुमतियों के साथ अपनी अनुमति सरणी को जोड़ना होगा, और आखिरकार अपनी सरणी से किसी भी अनुमति को हटा दें, जिसमें उनके allow_or_deny फ़ील्ड को FALSE पर सेट किया गया हो। यदि उपयोगकर्ता को कई पेड़ों तक पहुंच की आवश्यकता है, तो आप अपने खाता आईडी से मेल खाते खाते_ग्रुप तालिका में एक रिकॉर्ड जोड़ते हैं, यह बताते हुए कि उनके पास कितने पेड़ का उपयोग है, और फिर पेड़ के सभी बाद के समूहों के माध्यम से फिर से शुरू करें। खाते में सभी लागू अनुमतियां प्रदान करने के लिए, user_groups से account_id के लिए सभी समूह संघों को पकड़ें, और उसके बाद प्रत्येक पेड़ के लिए पहले वर्णित प्रक्रिया चलाएं। अगर उनके पास केवल एक पेड़ तक पहुंच है, तो आपको user_groups तालिका का उपयोग करने की भी आवश्यकता नहीं है।

an example of how the structure fits your model: 
group: USA, hierarchy = 0 
group: California, parent-> USA, hierarchy = 1 
group: Los Angeles, parent->California, hierarchy = 2 
group: Texas, parent->USA, hierarchy = 1 
group: Dallas, parent->Texas, hierarchy = 2 

समूह यूएसए के सदस्य सब कुछ एक्सेस कर सकते हैं। कैलिफोर्निया के सदस्य टेक्सास के लिए समूहों कैलिफ़ोर्निया के लिए वरीयता क्रम में बाद के सभी समूहों का उपयोग कर सकते हैं, लेकिन नहीं है, भले ही वे एक ही श्रेणीबद्ध मूल्य (क्योंकि वे विभिन्न पैतृक शाखाएं हैं)

account levels: 
admin, hierarchy=0 
manager, hierarchy=1 
analyst, hierarchy=2 
staff member, hierarchy=3 

प्रत्येक खाते में स्तर के सभी है प्रत्येक आगामी खाता स्तर के लिए अनुमतियां।

user accounts: 
Bob, manager (likes to spam junk email to everyone) 

तुम अब भी permissions_individual_permissions करने के लिए ईमेल अनुमति जोड़ने और असत्य को allow_or_deny मूल्य की स्थापना द्वारा बॉब के लिए ईमेल अनुमति को निरस्त कर सकते हैं। यह आपको बॉब को प्रबंधन से वंचित किए बिना स्पैमिंग से रोकने देता है।

example PHP array: 
$account=array(
    groups=>array(), //Step 1: array_push each group the account is a member of here. Repeat for each tree from user_groups. 
    account_levels=>array(), //Step 2: loop through $account[groups], array_push each level here 
    permissions=>array(), //Step 3: loop through $account[account_levels], array_push each permission here. Then do the same for individual permissions applied to the account 
    restrictions=>array() //Step 4: loop through individual permissions where allow_or_deny=FALSE, array_push here (do the same for group and account level if you implemented restrictions for those tables as well). Tell your program to ignore permissions from this array, even if the account would otherwise have them. 
); 
+0

इसके अलावा, यह आपको विभिन्न पेड़ों के लिए अलग-अलग अनुमति स्तर सेट करने देगा, इसलिए एक उपयोगकर्ता को एक पेड़ में राज्य का उपयोग हो सकता है, लेकिन केवल दूसरे पेड़ में नगरपालिका का उपयोग हो सकता है। – mopsyd

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