3

我目前正在研究用 PHP 重新构建一个不久前构建的权限系统。当前版本具有确切的权限,因此对于管理员,您将拥有以下权限:

acl.manage.self
acl.manage.others

这意味着用户有权管理他自己以及其他人的权限。

然而,在开发一些新应用程序时,我尝试通过以下方式让自己访问我的整个应用程序来利用当前的权限系统:

lst.*

这样我就不必给自己一堆.view .manage等等。

似乎现有系统不理解 * 通配符。所以我坐在这里试图重写“has_permission”

因此,我当前的工作测试环境创建了一个具有以下权限的用户:

array(3) { [0]=> string(1) "*" [1]=> string(15) "fake.permission" [2]=> string(27) "none.of.these.should.matter" } 

从技术上讲,唯一重要的权限是 [0],它表示我应该有权做任何我想做的事情。

我不知道如何在我的方法中实现这个流程:

function has_perm($perm){
    //if I am checking if I have the perm 'acl.manage.all'
    //This function should return true if I have any of the following:
    // *, acl.*, acl.manage.*, acl.manage.all   

    //exact check
    foreach($this->perms as $p){
        if($p===$perm){ return true; }
    }

}

任何朝着正确方向的轻推都会很棒。

4

1 回答 1

1

如果所需权限$perm与您的任何权限完全匹配,您当前的代码将返回 true $p

$perm如果所需的权限与任何fnmatch()模式匹配,您只需将其更改为返回 true $p

试试这个:

foreach($this->perms as $p) {
    if (fnmatch($p, $perm)) { return true; }
}

您不需要保留完全匹配检查,因为fnmatch()如果您的权限不包含通配符,仍然会检测到完全匹配。

于 2013-07-18T05:34:20.993 回答