如何为CakePHP中的站点功能构建内部访问控制

时间:2011-05-02 23:32:09

标签: cakephp acl access-control

我今天详细介绍了CakePHP Acl和Auth组件的教程和示例。我将Auth组件配置为使用$this->Auth->authorize = 'actions'。有了这个,我能够成功地限制对特定站点操作的访问而没有问题。

但是,我的应用程序需要超出此范围,我不确定如何最好地实现此应用程序的目标。

在我使用CakePHP 1.3.8开发的应用程序中,有特定的“站点功能”。例如,应用程序的用户将能够相互发送消息。

我想将每封邮件视为ACO,以便我可以控制谁可以查看或删除邮件。

另一个网站功能是为实现某些目标而获得“徽章”。对于这些徽章,我想把它们当作ACO来锁定和解锁这些徽章。

我不认为我可以使用CakePHP的开箱即用ACL功能来实现这一点,因为这不仅限制了对操作的访问。我正在寻找有关如何最好地实现此功能的任何想法。

2 个答案:

答案 0 :(得分:0)

使用CakePHP中的标准ACL功能,只能为控制器操作创建ACO条目。这意味着您的设置(将每条消息视为单独的ACO)将无法飞行。与徽章相同。

对于您的邮件,如果某个用户是邮件的发件人或收件人,我会进行设置,您可以在其中检查您的查看/编辑/删除方法。

这样的东西
# in messages_controller
function view($id) {
    if(!$isSender($loggedInUserId) || !$isReceiver($loggedInUserId)) {
        $this->Session->setFlash("You're not allowed to view this message")
        $this->redirect('index');
    }
    # do view stuff here    
}
function edit($id) {
    if(!$isSender($loggedInUserId)) {
        $this->Session->setFlash("You're not allowed to edit this message")
        $this->redirect('index');
    }
    # do edit stuff here    
}

关于徽章,我会在UserBadge之间寻找常规的HABTM(HasAndBelongsToMany)关系。当User达到某个目标时,您会拨打Badge::unlock($badge, $user)这样的电话,将用户的新徽章保存到users_badges联接表。

从那里你可以做基本的事情,比如列出某个用户的所有徽章等等。

答案 1 :(得分:0)

我对Cake的Acl组件进行了更加接近的研究,并认为我可以编写一些类似于我的内部“功能”访问控制的功能。我的想法是我可以有一个Faro(功能访问请求对象),Faco和Facos_Faros表。 Faco和Faro将建立HABTM关系。然后我可以创建自己的组件来管理它。