首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问控制问题

访问控制问题
EN

Stack Overflow用户
提问于 2011-06-11 22:37:01
回答 3查看 144关注 0票数 1

我正在为我的项目开发一个访问控制库,我希望找到这样做的最佳解决方案:

我将从数据库获取所有访问列表到一个数组。结果如下所示:

代码语言:javascript
复制
$array = array(
    '*' => array('administrator' => TRUE),
    'frontend/*' => array(
        'user' => TRUE,
        'unregistered' => TRUE
        ),
    'backend/*' => array(
        'user' => FALSE,
        'unregistered' => FALSE
    ),
    'backend/user/*' => array(
        'moderator' => FALSE,
        'supermoderator' => TRUE,
    ),
    'backend/article/*' => array(
        'supermoderator' => TRUE
    ),
    'backend/article/add/new' => array(
        'moderator' => TRUE
    )
);

“*”表示该用户可以访问所有相关选项--后端/文章/*--意味着该组可以访问所有的文章选项(文章/添加、文章/删除、.)。

正如您所看到的,backend/article/add中没有针对超级版主的项,但它可以访问所有文章页。

检查这个的最好方法是什么?我试过array_walk(),但我想它帮不了我。

谢谢你的建议..。

如果你愿意的话我可以分享我的全部代码。

*编辑*

我存错了吗?如果你有更好的办法储存它,我会很高兴听到它。

谢谢你的建议

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-11 23:52:39

我自己找到了答案:

假设试图访问backend/article/add/new的用户和超级版主组中的该用户。所以我需要找backend/*backend/article/*backend/article/add/*array_slice()for()足以满足以下要求:

顺便说一下,我正在使用CodeIgniter。我对它做了一些修改,以分离前端和后端控制器。我不使用application/controller目录。我正在使用application/backendapplication/frontend目录作为控制器。

因此,uri模式是这样的:http://site.com/[backend]*/[directory]*/class/method

代码语言:javascript
复制
// This is the page that user trying to reach
$requested_page = "backend/article/add/new";

// pharsing...
$x = explode('/', $requested_page);

// this is needed to cut last 3, 2, 1 items of $x
$i = count($x) > 3 ? -4 : -count($x);

for (; $i < 0; $i++) {
    $resource = implode('/', array_slice($x, 0, $i)) . '/*';
    // echoing for debug
    echo $resource;
}

// Outputs:
// backend/*
// backend/article/*
// backend/article/add/*
票数 0
EN

Stack Overflow用户

发布于 2011-06-11 22:55:01

无论这将是一个复杂的算法,一个简单的array_walk是做不到的。除非有人觉得特别慷慨,并会为你写一个,我建议你雇用一个程序员

我存错了吗?如果你有更好的办法储存它,我会很高兴听到它。

这完全取决于你的算法。您可能可以使用当前的数据格式编写一个。如果您更改数据格式,也可能会编写一个更简单的。但是你的数据格式应该是什么样子呢,嗯,这是程序员的工作。

票数 0
EN

Stack Overflow用户

发布于 2011-06-12 09:11:10

代码语言:javascript
复制
function userHasPermissions($permissionsArray, $user, $path) {
    // Check exact
    if(isset($permissionsArray[$path]) &&
       isset($permissionsArray[$path][$user])) {
        return $permissionsArray[$path][$user];
    }

    // Check lower and lower
    $partArr = explode('/', $path);
    for($i = substr_count($path, '/'); $i >= 0; $i--) {
        if($i > 0) {
            $choppedPartArr = array_slice($partArr, 0, $i);
            $newPath = implode($choppedPartArr, '/') . '/*';
        } else {
            $newPath = '*';
        }

        if(isset($permissionsArray[$newPath]) &&
           isset($permissionsArray[$newPath][$user])) {
            return $permissionsArray[$newPath][$user];
        }
    }

    return false;
}

echo "Result: " . (userHasPermissions($array, 'supermoderator', 'backend/article/add') ? "true" : "false");

请注意,‘后端/文章’将返回为‘超级版主’假,因为‘后端/文章/*’不匹配它。要改变这一点,只需将$i = substr_count($path, '/');更改为$i = substr_count($path, '/')+1;即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6318930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档