学习笔记三 创建保存动态的ACL

创建保存动态的ACL
在这一个笔记中主要学习的是使用动态的ACL:如何在数据库中存储ACL,当我们需要时我们如何把它拿出来使用。本节分为两个小部分:首先我们要接触一个简单的例子:用户和网页,然后我们将会接触更复杂的例子:通过继承role类型和其他的东西,建立更加复杂的ACL。
1.为什么使用动态ACL
以前的“静态”的ACL适用于快速的简单的网站。但是现在大多数网站需要在admin panel定义访问权限,明显要想修改权限需要去代码里面该ACL。
同样的如果我们的网站有很多的用户和很多的用户组。如果我们使用整个ACL的话,将是极其占用资源的。关于这个部分我们将要学习,从整个ACL里建立部分ACL。
想象一下你有一个用户,你必须检查用户是否有权限访问特定的网页,你觉得下载包含整个用户,整个组和所有的resource(网页)的ACL,然后设置所有的权限很方便么?当然不会。更方便的方法是:建立一个只包含一个用户一个需要检查访问权限的resourceACL。
2.一个简单的user和group的例子
现在我们看一个简单的例子:我们的网站包含一些网页,我们需要定义哪一个用户能够访问哪一个页面。默认情况下没人能访问这个网站,除非我们给他权限。
以下是数据库结构

bb
这里有三个表:resource,用户,用户-resource表
这里每一个用户是一个role每一个网页时一个resource
ACL factory
在我们继续之前,我们先了解一下什么事ACL factory。顾名思义ACL factory就是一个生产ACL的类,它用于构造我们的ACL实例。这个使我们能够更好的追踪代码。

This is the basic factory we’ll be using now:

class AclFactory {
/**
* Creates an ACL for a specific page
* @param Page $page
* @return Zend_Acl
*/

public function createAcl(Page $page) {
//Lets assume we have a model for the page_privileges with a method like this
//which would return PagePrivilege objects with the page_id passed as the param.
$privileges = PagePrivilege::findByPageId($page->getId());
 
$acl = new Zend_Acl();
$acl->add(new Zend_Acl_Resource($page->getId()));
 
foreach($privileges as $privilege) {
$acl->addRole(new Zend_Acl_Role($privilege->getUserId()));
$acl->allow($privilege->getUserId(), $page->getId());
}
 
return $acl;
}
}
这个函数工作的方式首先取得所有的网页的权限,每一个page id记录,然后建立一个Zend_Acl实例然后通过page id增加一个资源,然后是一个小的循环,把所有数据库中的用户加到ACL中去。然后把page属性标为allowed。
现在我们建立了factory但是他是怎样工作的呢?由于我们使用userid作为roleid,所以我们能够循环每一个数据库中的权限,然后把userid加到权限中,并加到ACL中去。这样的话,ACL将有对应这个资源的所有的roles。

使用facory

我们有了一个能为我们建立ACL的工厂,现在来看看怎么工作的。
//Lets say $page is a page we want to access
$factory = new AclFactory();
$acl = $factory->createAcl($page);
 
//and $user is the currently logged in user
if($acl->hasRole($user->getId()) && $acl->isAllowed($user->getId(), $page->getId()) {
//Access OK
}
所以我们使用factory建立ACL,并且像平常一样使用它。在以上代码中我们同样用到了hasRole方法检查ACL是否正确。

fj.pngacl1.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225983/viewspace-662901/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225983/viewspace-662901/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值