繁体   English   中英

PHP:如何检查用户是否可以递归访问某个组?

[英]PHP: How to check if user can access a certain group recursively?

我正在尝试为我的用户创建一个简单的访问检查。 基本上,我有一个像trialpaidadmin等定义的数组,如下所示:

$levels = ['trial' => [], 'enterprise' => ['admin'], 'paid' => ['trial'], 
 'admin' => ['paid', 'editor'], 'editor' => []];

看一下paid组。 paid组的数组中包含trial组,这意味着paid组用户也可以访问trial组。

同样, admin组可以访问paideditor trial组,因为admin在其阵列中具有paid组,而paid组在其阵列中具有trial组(我想需要递归)。

我的函数是这样的(但是我无法弄清楚递归部分 ):

<?php
public function hasAccess($requiredLevel, $myLevel) {    
    global $levels;
    return (($myLevel == $requiredLevel) || (in_array($requiredLevel, $levels[$myLevel]));  
}

当级别直接存在于数组中但无法建立关联时,例如,当级别连接起来,例如admin => paid => trial

如何修改此功能,以便它可以以最简单的方式递归检查?

PS它们的存储顺序也不固定。

应该这样做:

public function hasAccess($requiredLevel, $levels, $myLevel) {
    // Check if $myLevel matches $requiredLevel
    if ($requiredLevel === $myLevel) {
        return true;
    }

    // Iterate through all levels under $myLevel
    foreach ($levels[$myLevel] as $level) {
        // If any of those levels has access, return true
        if ($this->hasAccess($requiredLevel, $levels, $level)) {
            return true;
        }
    }

    return false;
}

我希望这些评论足以为您解决。

我还建议您传入$levels作为参数,而不要使用全局变量,因为它可以提供更大的灵活性,并且全局变量通常是一种不好的做法。

您唯一需要注意的是循环引用,在循环引用中最终会出现无限循环。 为了解决这个问题,只需将已经访问过的级别数组作为可选参数传递:

public function hasAccess($requiredLevel, $levels, $myLevel, $visited = []) {
    // Check if $myLevel matches $requiredLevel
    if ($requiredLevel === $myLevel) {
        return true;
    }

    // Add the current level to the visited array
    $visited[] = $myLevel;

    // Iterate through all levels under $myLevel
    foreach ($levels[$myLevel] as $level) {
        // Return true if any of those levels has access,
        // and hasn't been visited before
        if (
            !in_array($level, $visited) &&
            $this->hasAccess($requiredLevel, $levels, $level, $visited)
        ) {
            return true;
        }
    }

    return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM