Проблема контроля доступа - PullRequest
1 голос
/ 12 июня 2011

Я занимаюсь разработкой библиотеки управления доступом для своего проекта и ищу лучшее решение для этого:

Я получаю весь свой список доступа из базы данных в массив.В результате это выглядит так:

$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 / * означает, что группа имеет доступ ко всем параметрам статьи (article / add, article/ удалить, ...).

Как видите, в backend/article/add нет элемента для супермодератора, но он имеет основной доступ ко всем страницам статьи.

Как лучше всегопроверить это?Я пытался array_walk(), но, думаю, это мне не поможет.

Спасибо за советы ...

Я могу поделиться всем своим кодом, если хотите.

* Редактировать *

Я храню неправильно?Если у вас есть лучшее решение для его хранения, я буду рад его услышать.

Спасибо за любые советы

Ответы [ 3 ]

0 голосов
/ 12 июня 2011

Я нашел ответ сам:

Допустим, пользователь пытается получить доступ к backend/article/add/new и этот пользователь в группе супермодераторов. Поэтому мне нужно искать backend/*, backend/article/*, backend/article/add/*. array_slice() и for() достаточно для этого:

Кстати, я использую CodeIgniter. Я немного изменил его, чтобы разделить контроллеры внешнего интерфейса и внутреннего интерфейса. Я не использую каталог application/controller. Я использую каталоги application/backend и application/frontend для контроллеров.

Итак, шаблон Ури это: http://site.com/[backend]*/[directory]*/class/method

// 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 голосов
/ 12 июня 2011
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");

Обратите внимание, что 'backend / article' вернет false для 'supermoderator', поскольку 'backend / article / *' не соответствует ему Чтобы изменить это, просто измените $i = substr_count($path, '/'); на $i = substr_count($path, '/')+1;.

0 голосов
/ 12 июня 2011

Независимо от того, что это будет сложный алгоритм, простой array_walk не сделает. Если кто-то не чувствует себя особенно щедрым и напишет его для вас, я предлагаю вам нанять программиста.


Я храню неправильно? Если у вас есть лучшее решение для его хранения, я буду рад его услышать.

Это полностью зависит от вашего алгоритма. Вы, вероятно, можете написать тот, который использует ваш текущий формат данных. Вы также можете написать более простой, если вы измените формат данных. Но как должен выглядеть ваш формат данных, это работа для программиста.

...