好的,我尝试自己实现它。也许它不漂亮,但这是我自己想出的最佳解决方案。这是正确的方向吗?我将不胜感激任何反馈!
解决方案:
我使用我的模型而不是字符串作为资源和角色(这里建议)。我PointResourceInterface
用来标记需要特定点数的资源并Zend\Permissions\Acl\Role\RoleInterface
在我的用户类中实现。现在我创建一个新的NeededPointsAssertion
:
class NeededPointsAssertion implements AssertionInterface
{
public function assert(Acl $acl, RoleInterface $role = null,
ResourceInterface $resource = null, $privilege = null) {
// Resource must have points, otherwise not applicable
if (!($resource instanceof PointResourceInterface)) {
throw new Exception('Resource is not an PointResourceInterface. NeededPointsAssertion is not applicable.');
}
//check if points are high enough, in my app only users have points
$hasEnoughPoints = false;
if ($role instanceof User) {
// role is User and resource is PointResourceInterface
$hasEnoughPoints = ($role->getPoints() >= $resource->getPoints());
}
return $hasEnoughPoints;
}
}
PointResourceInterface
看起来像这样:
use Zend\Permissions\Acl\Resource\ResourceInterface;
interface PointResourceInterface extends ResourceInterface {
public function getPoints();
}
设置:
$acl->allow('user', $pointResource, null, new NeededPointsAssertion());
用户可以访问需要积分的资源。但另外NeededPointsAssertion
检查。
访问:
我正在检查是否允许这样访问:
$acl->isAllowed($role, $someResource);
如果有用户$role = $user
,否则它是guest
或其他东西。
灵感来自http://www.aviblock.com/blog/2009/03/19/acl-in-zend-framework/
更新:现在回过头来看,也可以通过构造函数添加所需的点并将其存储为属性。自己决定什么在你的应用程序中有意义......