CakePHP разрешения ACL внутри циклов - PullRequest
0 голосов
/ 02 марта 2012

допустим, у меня в базе данных есть таблица с именем users, и я хочу проверить, есть ли у всех пользователей в моей таблице разрешение на выполнение определенного действия контроллера. Если я сделаю что-то вроде этого:

foreach($users as $user)
{
    // check if user has permission to execute action
    $is_allowed = $this->Acl->check(
            array('model'=>'User', 'foreign_key'=>$the_user_id),
                'controllers/MyController/action_to_be_executed');

    if(!$is_allowed)
    {
        // give permission to user
        $this->Acl->allow(
            array('model'=>'User', 'foreign_key'=>$the_user_id),
                'controllers/MyController/action_to_be_executed');
    }
}

Очевидно, что если у меня будет что-то подобное, чем больше пользователей в моей таблице, тем медленнее будет этот код. Кто-нибудь знает, как я могу оптимизировать это, чтобы он работал достаточно быстро, хотя моя таблица насчитывает более 5000 пользователей? Есть предложения?

Заранее спасибо

1 Ответ

1 голос
/ 02 марта 2012

Первая мысль была использовать

$this->Auth->allow('action_to_be_executed');

в MyController коде контроллера, но на самом деле это, вероятно, не то, что вы хотите сделать, потому что он предоставит доступ любому, даже посетителям, не вошедшим в систему.

Если ваша цель - предоставить доступ любому аутентифицированному пользователю, вероятно, это не оптимизированное решение для добавления специального разрешения для каждой пары user <-> action_to_be_executed.

Вместо этого вы можете связать пользователей с ролью (если это еще не сделано) и предоставить доступ к действию action_to_be_executed для каждой роли. Таким образом, это резко ограничит количество записей разрешений в таблице aros_acos, и, кроме того, вам вообще не нужно будет выполнять код, что было бы неплохой оптимизацией; -)

...