2012-02-11 78 views
0

我正在爲包含多個部門的業務創建一個Web應用程序。我使用PHP和MySql來做到這一點,在我的數據庫中,我將選項N(無法訪問),R(只讀)和RW(讀寫)的權限存儲爲ENUM。會話變量的替代方法?

一旦用戶登錄,php腳本將找到適當的權限並將其存儲在會話中。例如:如果用戶有RW用於生產,則會話變量爲$_SESSION['production'] = RW。現在,無論何時我需要查看是否允許用戶編輯生產,我都會檢查會話變量並採取適當的操作。

我有20個這樣的特權類別。這當然不是存儲這種東西的方式。這隻會增加加載時間並佔用大量內存。有沒有其他方法可以儲存user rights

注意:20類別列表預計會增加。

+0

我認爲會議是爲了這種東西。存儲在數據庫中會使用更多的資源。並在cookie中存儲是一個不在這裏。 我會的。進行分組。像組1具有完全特權,組2具有較少,組4沒有。類似的東西。對不起,如果我不清楚。 – Alice 2012-02-11 14:02:04

+0

好吧,我已經有團體,如果有一個生產類別,現在有像production_orders等子葫蘆,這就是我在會議中存儲的。但它似乎不是一個非常有效的方法。希望這說明了,讓我知道你是否需要更多的信息。 – Namit 2012-02-11 14:05:03

回答

2

我通常使用

$_SESSION['privileges']=array(
    'someprivilege' => 'r', 
    'someotherprivilege' => 'rw' 
) 

保持在上下文中對存儲器的要求:100個特權,由20個字符,5個字符的值的名稱,將加起來少於一頁(4K)。加載時間問題很大程度上由PHP在會話文件中使用非常有效的二元序列化程序來解決。

0

您應該只在應用時選擇權限。這將使您的負載限制在所需的範圍內。

或者,您可以以序列化的形式存儲每個用戶的權限。然後這將是一個單一的檢索操作(而不是20或更多)。封裝邏輯背後的邏輯,以便您可以同時輕鬆地將其存儲在數據庫和會話中,並輕鬆管理和存儲它們。

除了這些一般建議之外,無論如何我都看不到太多的「負載」。你需要做你需要做的事情。如果你想減少麻煩,你可以減少權限的數量,但這顯然不會有用,因爲你想要的。

然後,您的會話有什麼問題?或者更具體地說,你是什麼意思加載?

+0

我不介意將它們存儲在一個會話中,但我只是想知道在會話中存儲太多變量並不是一個好主意。因此我想知道替代方案。 – Namit 2012-02-11 14:21:51

+1

所以你讀了。你讀到哪裏,哪個號碼告訴你是壞的?而就在那時,你遇到了具體的問題?對你有害嗎?你有證實嗎?你會發現任何寫在互聯網上的意見,所以更好地小心。 – hakre 2012-02-11 14:52:24

+0

這是一個有效的觀點,你不應該在會議中存儲太多混亂。我最近不得不調整會話文件大於4MB的應用程序 - 這是一場噩夢。在每個請求中檢索到的相對較小的一組權限是會話中存儲的完美候選者。 – nnichols 2012-02-11 15:10:14

1

爲什麼不將訪問權限存儲在數據庫中,並在用戶標識符需要時檢查它們? 您只需要在$ _SESSION中存儲用戶標識。 這簡化了整個應用程序。

如果您在會話中存儲訪問權限,您需要始終確保它們始終在任何時間點保持最新狀態。例如,如果管理員想要更改用戶訪問權限,則他們需要具有將用戶註銷的額外功能。或者,例如,您需要每次用戶嘗試訪問該頁面時更新$ _SESSION,這是開銷,並且無論如何都需要每次檢查數據庫。

+0

我最初是這麼做的,但是我的主管(數據庫教授)告訴我,對每個​​頁面實際運行該查詢並不是一個好主意。他讓我將它們存儲在本地,然後訪問它們,因爲它增加了加載頁面的速度。 – Namit 2012-02-11 14:24:59

+0

您可以使用緩存來避免每次運行查詢。當需要更改訪問權限時,您將能夠刷新緩存。而且你不需要詢問用戶登錄/註銷 – alex347 2012-02-11 14:31:52

+0

這是一個好主意,但作爲一個商業應用程序,緩存會在稍後引發安全問題。 – Namit 2012-02-11 14:34:45

1

您可以創建一個標識類來封裝您的所有用戶信息(標識符,特權以及這些屬性的獲取者),並在用戶通過使用用戶標識從DB獲取權限登錄後立即創建標識類。

然後每次你需要找到他的權利只需調用getRights();來自你的身份課。