2014-02-20 56 views
5

背景一般/爾康 - ACL和數據庫存儲

我目前工作的一個爾康應用。應用程序本身相對簡單,但我將它用作了解一些更高級概念和技術的工具。

我已經放棄了我的自制ACL(訪問控制列表)解決方案,並且在Phalcon中提供了ACL。

這個問題更具概念性,因爲我會對實施任何解決方案充滿信心。

問題

問題是這樣的: 「你在哪裏保存你的ACL信息?」

可能的解決方案

我現在有一個靜態數組,我充滿了各種行動和他們的訪問級別。

我覺得這是有限制的,並且可能通過數據庫存儲更好地服務。

我可以使用位掩碼來指示允許訪問各種資源的用戶角色,也可以是最低級別。

我有的另一個問題是它是分層的(在某種程度上),但可能存在多個角色 - 權限稍有不同。

eg. 
Admin has all roles of captain, secretary and user. 
Captain has all the roles of a user and the ability to pick players. 
Secretary has all the roles of a user and contact the opponent's secretary. 
Captain and secretary both have the ability to email players. 

把它想象成有些權限的維恩圖的,如果你願意。

緩存

下一個問題,將數據庫的每一次訪問,會增加性能開銷,所以我想將其高速緩存纔有意義。

問題就出現了,如何使緩存失效(計算機科學中只有兩件難事......)......也許可能會有一個數據庫字段有ACL的md5散列,這是在頁面加載時檢查,看它是否需要重新加載ACL信息。

+0

如果可以的話,我會碰到你。我本質上是同一條船。將ACL存儲在一個文件中(按照文檔)看起來有點簡單。如果你找到了更好的方法來做到這一點,你可以編輯這個問題嗎? – TheMonarch

+1

我目前還沒有找到合適的解決方案。這篇文章沒有收到更多的評論是一種遺憾,因爲我認爲這是一個非常有趣的問題。 我想答案是將它存儲在數據庫中,然後緩存它?對這個問題的優點做一些澄清是很好的,如果不是的話,將會有什麼替代方案。 –

+0

是的君主你的問題是非常好的,經常被phalcon用戶問到。 即使我正在尋找同樣的解決方案,我還沒有找到任何地方。 我試圖編寫一些自定義代碼來使ACL動態使用數據庫,但仍然與它掙扎。 請指導,如果你已經達到相同。 @TheMonarch –

回答

1

是@TheMonyarch您的問題是非常好的,並且經常被phalcon用戶詢問。即使我正在尋找同樣的解決方案,我現在還找不到任何地方。我試圖編寫一些自定義代碼來使ACL使用數據庫動態化,但仍然困擾着它。

我在瀏覽很多網站和博客,最後我遇到了這樣的DB結構,可能有助於建立這樣的系統。

CREATE TABLE `roles` (
    `name` VARCHAR(32) NOT NULL, 
    `description` TEXT, 
    PRIMARY KEY(`name`) 
); 
CREATE TABLE `access_list` (
    `roles_name` VARCHAR(32) NOT NULL, 
    `resources_name` VARCHAR(32) NOT NULL, 
    `access_name` VARCHAR(32) NOT NULL, 
    `allowed` INT(3) NOT NULL, 
    PRIMARY KEY(`roles_name`, `resources_name`, `access_name`) 
); 

CREATE TABLE `resources` (
    `name` VARCHAR(32) NOT NULL, 
    `description` TEXT, 
    PRIMARY KEY(`name`) 
); 

CREATE TABLE `resources_accesses` (
    `resources_name` VARCHAR(32) NOT NULL, 
    `access_name` VARCHAR(32) NOT NULL, 
    PRIMARY KEY(`resources_name`, `access_name`) 
); 

CREATE TABLE `roles_inherits` (
    `roles_name` VARCHAR(32) NOT NULL, 
    `roles_inherit` VARCHAR(32) NOT NULL, 
    PRIMARY KEY(roles_name, roles_inherit) 
); 

任何建議或改變將不勝感激!!!