我們正在使用Zend框架和Mysql開發Web應用程序。授予用戶訪問權
目前,帳戶是唯一的電子郵件地址。我們希望能夠允許帳戶的管理員向另一個帳戶的管理員授予訪問權限。此人將成爲關聯賬戶的「用戶」。賬戶持有者然後登錄到他們的管理員賬戶,然後選擇他們想要訪問哪個鏈接賬戶。
請注意:訪問只能是一種方式。帳戶1授予對帳戶2的訪問權限,但不應該能夠訪問帳戶2.只有帳戶2才能訪問帳戶1.如果帳戶1想要訪問帳戶2,則帳戶2必須授予帳戶1的訪問權限。
這是怎麼回事?
我們正在使用Zend框架和Mysql開發Web應用程序。授予用戶訪問權
目前,帳戶是唯一的電子郵件地址。我們希望能夠允許帳戶的管理員向另一個帳戶的管理員授予訪問權限。此人將成爲關聯賬戶的「用戶」。賬戶持有者然後登錄到他們的管理員賬戶,然後選擇他們想要訪問哪個鏈接賬戶。
請注意:訪問只能是一種方式。帳戶1授予對帳戶2的訪問權限,但不應該能夠訪問帳戶2.只有帳戶2才能訪問帳戶1.如果帳戶1想要訪問帳戶2,則帳戶2必須授予帳戶1的訪問權限。
這是怎麼回事?
我認爲試圖將權限綁定到帳戶是您的問題,您需要添加第二個「圖層」。讓我們繼續以Google Analytics爲例:
假設Joe Bloggs想要使用Google Analytics。他首先必須創建一個Google帳戶(假設他還沒有)。然後,他爲其網站創建了Google Analytics帳戶。說喬然後想要訪問簡史密斯,讓我們假設她已經有一個谷歌帳戶。爲了讓她訪問所有他正在做的是讓她的谷歌帳戶訪問他的網站,他沒有讓她訪問他的谷歌帳戶。
Zend_Acl是基於角色的,所以我們試着將ZF概念應用到這個例子。 GA中的用戶管理屏幕允許您向用戶提供「僅查看報告」權限或「帳戶管理員」權限。所以,你會定義Zend_Acl裏一個角色的每一個訪問級別:
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('admin'), 'guest');
上addRole第二個參數是指應當從指定的其他角色繼承的所有權限。所以我上面做的是定義兩個角色:guest和admin;並且所述管理員應該繼承客人擁有的所有權限。
然後,您就擁有了您的「資源」,這是可以訪問的東西。因此,我們將定義一個報告,一個用於用戶管理:
$acl->add(new Zend_Acl_Resource('reports'));
$acl->add(new Zend_Acl_Resource('users'));
,那麼我們就會「客人」訪問報告,以及「管理員」用戶訪問:
$acl->allow('guest', 'reports');
$acl->allow('admin', 'users');
然後在相關的控制器(或插件或其它地方),你可以檢查權限:
public function reportsAction()
{
[...]
// assume $role contains the role of the currently logged in user
if (!$acl->isAllowed($role, 'reports')) {
// show a permissions error
}
}
public function usersAction()
{
[...]
if (!$acl->isAllowed($role, 'users')) {
// permissions error
}
}
至於存放在MySQL這個的話,你只需要鏈接的用戶,網站(在這個例子中)和角色查找表:
userID | siteID | role
1 1 admin
2 1 guest
簡單英語:這是否意味着您需要創建用戶組? – takeshin 2010-09-13 13:26:52
這真的是特定於mysql嗎?大多數Web應用程序在應用程序級別實施「帳戶」,並僅將數據庫用作數據存儲。同樣,你似乎在你的問題中以多種方式使用用戶/管理員。一些更多的細節將會更好,更好的具體例子。但實質上你似乎在談論傳遞權限 – 2010-09-13 13:34:10
讓我看看我能否更清楚。 「管理員」是擁有該賬戶的人。 「用戶」是被授權使用該帳戶但沒有管理員權限的人。 可以說我們有兩個賬戶。根據電子郵件地址,帳戶是唯一的。 帳戶1希望帳戶2管理他們的帳戶。爲了發生這種情況,賬戶1必須授權其他賬戶。這樣做將允許帳戶2登錄到他們自己的帳戶,然後單擊鏈接來管理帳戶1. 此概念與Google Analytics和Google Adwords帳戶管理的工作原理非常相似。 – user387990 2010-09-13 15:01:20