2012-04-26 99 views
1

我是新來的PHP和我正在創建一個電子商務網站。我爲管理員創建了一個CMS後端,用於添加/編輯/刪除產品,管理訂單,管理商店配置以及添加/編輯/刪除用戶。PHP上的用戶訪問級別

我無法找出如何設置用戶權限/權限,因此: - 普通員工只能訪問管理訂單和 - 管理人員擁有的一切

訪問

所以基本上給用戶一個角色這將給他們限制或完全訪問一切。

是否有任何教程或任何以前有過添加此功能的經驗的人可以將我指向正確的方向?

任何幫助將不勝感激。謝謝

+0

你在使用像Zend或Symfony這樣的框架,還是隻使用自己的直接php代碼?如果你直接編碼,你的代碼/類結構是什麼樣的? – Tom 2012-04-26 15:36:18

+0

參考http://en.wikipedia.org/wiki/Access_control_list和Zend框架中的示例實現http://framework.zend.com/manual/en/zend.acl.introduction.html – 2012-04-26 15:38:11

+0

那麼現在,我有隻實現您的標準用戶訪問。這些用戶都在數據庫中,並可以訪問所有內容。 我目前正在尋找這個以獲得更好的理解:http://en.wikipedia.org/wiki/Role-based_access_control – JUM 2012-04-26 15:40:32

回答

1

權限與角色關聯,並且用戶與角色關聯。雖然有,毫無疑問,許多方法來實現這種類型的系統,接踵而來的是一個快速的概念,從中你可以開始思考:

Users: 
    + userid 
    + roleid /* Associate a Role to a User */ 

Roles: 
    + roleid 
    + rolename 

Permissions: 
    + permissionid 
    + permissionname 

RolePermissions: 
    + roleid 
    + permissionid /* Associate a Permission to a Role */ 

注意在第一個表如何作用是直接從用戶中相關表。如果您想爲用戶分配多個角色,您可以將其分解並放入自己的表中。

一旦這一切都到位或類似的東西,您可以通過會話變量跟蹤用戶的角色,並確定用戶是否被允許執行任何給定的動作,通過查找ID /名稱該操作以及角色的ID /名稱,位於RolePermissions表中。

if ($user->allowed('deleteUser')) { 
    $users->remove($uid); 
} 

當然,數據庫方面只是工作的第一部分。接下來,您需要實現數據庫和代碼之間的連接。

1

有幾種方法可以做到這一點,這取決於您的應用程序將如何增長。如果您確信只有這兩個配置文件,那麼只需在「用戶」表中添加一個「配置文件」字段即可。

我想你已經實現了登錄管理,那麼你可能會在會話中保持記錄的用戶ID。只要保持配置文件類型也和你每次顯示某些組件,應便於只是管理者,敷在

<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?> 
<!-- display your thing here --> 
<?php endif; ?> 

注意,這可能僅僅隱藏元素。你將不得不在你的代碼中執行這個檢查,以防止相應的動作被執行...

如果你使用像CodeIgniter這樣的MVC框架,更好的方法就是將所有的請求您的訪問控制器,並將用戶重定向到「訪問禁止」頁面,如果他試圖訪問他不允許的內容。這樣,您的訪問權限只能在一個地點進行控制。

那麼,這是一個複雜的主題,很大程度上取決於您的項目的體系結構,所以很抱歉,如果這不能正確回答您的問題。

+0

嘿Gaet,我認爲這是我正在尋找的那種東西。如上所述,只有2個配置文件。 這真的可以幫助我。謝謝 – JUM 2012-04-26 17:05:28

2

另一種設計是什麼@Johnathan建議將是一個user HAS_MANY roles每個role HAS_MANY permissions

Users: 
    + id 
    + name 

Roles: 
    + id 
    + name 

Permissions: 
    + id 
    + name 

然後你將用戶鏈接到他們的每一個角色,(和角色,以他們的每一個權限),就像這樣:

RolesUsers: 
    + id 
    + role_id /* Associate a Role to a User */ 
    + user_id /* Associate a User to a Role */ 

RolePermissions: 
    + id 
    + role_id  /* Associate a Role to a Permission */ 
    + permission_id /* Associate a Permission to a Role */ 

而不是級聯的角色,或者只允許用戶在一個角色 - 具有多種角色的用戶提供最大的靈活性。

1

從喬納森的結構擴展,我做了一些修改:

Users: 
    + userid 
    + roleid /* Associate a Role to a User */ 

Roles: 
    + roleid 
    + rolename 
    + roleinherit /* Added this field */ 

Permissions: 
    + permissionid 
    + permissionname 

RolePermissions: 
    + roleid 
    + permissionid /* Associate a Permission to a Role */ 

能夠從其他角色繼承真的可以幫助簡化訪問控制。例如,可以說「調節者」角色繼承了繼承「訪客」角色的「用戶」角色。這樣,即使主持人做不到,你也從來沒有一個能做事情的客人。

當然,由於您不能再創建一個簡單的查詢來檢查,因此此結構可能難以實現。處理這些問題的好方法是創建一個遞歸函數,爲用戶角色提取數據,然後將其與該函數的結果合併爲繼承角色。

function getPermissions($roleID) { 
    // get info about this role and store it in $permissions. Assume we also set $inheritFrom 
    if ($inheritFrom == 0) return $permissions; 
    else return array_merge($permissions, getPermissions($inheritFrom)); 
} 

確保緩存此函數的結果,因爲它可能會變得很沉重。