Может кто-нибудь, пожалуйста, поставьте это на английском для меня PHP Cakephp - PullRequest
0 голосов
/ 18 апреля 2011

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

учебник говорит: 1 - раскомментируйте префикс маршрутизации администратора в core.php

2 - добавить следующее в users_controller.php:

public function dashboard() {
        $role = $this->Auth->user('role');
        if (!empty($role)) {
                $this->redirect(array($role=>true, 'action'=>'dashboard'));
        }
}

public function admin_dashboard() {
}

public function manager_dashboard() {
}

3 - создать три вида для вышеупомянутого

4 - в app_controller добавить компоненты авторизации и сеанса с соответствующие настройки, затем добавьте:

        public function isAuthorized() {
                $role = $this->Auth->user('role');
                $neededRole = null;
                $prefix = !empty($this->params['prefix']) ? $this-
>params['prefix'] : null;

                if (!empty($prefix) && in_array($prefix,
Configure::read('Routing.prefixes'))) {
                        $neededRole = $prefix;
                }
                return (empty($neededRole) || strcasecmp($role, 'admin') == 0 ||
strcasecmp($role, $neededRole) == 0);
        }

5 - в макете по умолчанию:

<?php
        $dashboardUrl = array('controller'=>'users', 'action'=>'dashboard');
        if (!empty($user['role'])) {
                $dashboardUrl[$user['role']] = true;
        }
        echo $this->Html->link('My Dashboard', $dashboardUrl);
?>

Теперь все это работает, и я могу следить за большинством событий, но Я запутался с последней строкой в ​​методе isAuthorized. Какие точно делает:

return    (empty($neededRole)             || 
           strcasecmp($role, 'admin')== 0 ||
           strcasecmp($role, $neededRole) == 0);

на самом деле вернуть?

Кроме того, приведенный выше код работает нормально, и когда я вхожу в систему под именем admin они могут просматривать admin_dashboard нормально, но там после кажется любая другая ссылка имеет префикс администратора. Как мне остановить это? я не хочу создавать метод admin_ для всего, включая домашняя страница!.

Ответы [ 4 ]

1 голос
/ 18 апреля 2011

Для решения первой части вашего вопроса ...

return (empty($neededRole) || strcasecmp($role, 'admin') == 0 || strcasecmp($role, $neededRole) == 0);

Возвращает логическое значение. Переставьте это так, чтобы было немного больше смысла:

return (
        empty($neededRole)
     || strcasecmp($role, 'admin') == 0
     || strcasecmp($role, $neededRole) == 0
);

Таким образом, он вернет true, если будет выполнено любое из трех условий:

  • empty($neededRole) является true
  • strcasecmp($role, 'admin') равно 0
  • strcasecmp($role, $neededRole) равно 0

Согласно документации , последние два будут равны нулю, если два аргумента совпадают. Итак, функция вернет true, если:

  • Нет значения $neededRole или;
  • $role совпадает с "admin" или;
  • $role, если совпадает с $neededRole

Если ни одно из этих условий не выполнено, будет возвращено false.

1 голос
/ 18 апреля 2011
empty($neededRole) || 
strcasecmp($role, 'admin') == 0 || 
strcasecmp($role, $neededRole) == 0

Необходимая роль пуста / пуста: пусто ($ requiredRole) ИЛИ
роль «admin» при сравнении без учета регистра: strcasecmp ($ role, 'admin') == 0 ИЛИ
эта роль совпадает с необходимой ролью при сравнении без учета регистра.

Таким образом, он возвращает значение true, если ему не требуется роль, или роль администратора, или роль совпадает с требуемой ролью, в противном случае - false.

0 голосов
/ 18 апреля 2011

Код возвращает:

  • пусто ($ requiredRole) (возвращает true / false)
  • strcasecmp ($ role, 'admin') (возвращает 0, если равен)
  • strcasecmp ($ role, $ requiredRole) (возвращает 0, если равен)

Что касается маршрутизации ADMIN, она не потребуется для ВСЕХ функций (включая домашнюю страницу). Только если вы хотите «скрыть» функции (предоставить только функции администратора), вы добавляете префикс администратора. Затем вы можете заблокировать доступ ко всем функциям с префиксом ADMIN, если они не имеют соответствующей авторизации. Это предотвратит несанкционированный доступ к этим методам. Когда вы добавляете префикс admin_ в начало метода, это означает, что он специфичен для роли ADMIN. Администратор по-прежнему будет иметь доступ ко всему остальному.

0 голосов
/ 18 апреля 2011

Из документации http://php.net/manual/en/function.strcasecmp.php strcasecmp сравнивается со строками, игнорирующими регистр, возвращая 0, если они совпадают, поэтому последняя строка говорит:

If the needed role is empty (you don't need a role)
    You are authorized
OR IF your role is 'admin'
    You are authorized
OR IF your role is the needed role 
    You are authorized
ELSE
    You are not authorized

Что касается вашего другого вопроса,Я не уверен, но я почти уверен, что вам нужен метод admin_*, но эти методы могут делегироваться обычному методу, где никакой специальной логики не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...