2013-12-18 2 views
1

Я использую CakePHP в своем проекте, и я ищу подходящий способ проверить расширенные права пользователей в моих представлениях.CakePHP: Проверить авторизацию во взглядах

У меня есть несколько страниц, в которых содержание зависит от ваших прав (вы можете просматривать некоторые блоки или нет, изменить некоторые Infos или нет, и т.д. ...)

Я искал и единственный способ, которым я нашел это реализовать Auth Helper, но я подумал, что лучший способ - реализовать методы в моем «UserController» (например, canPerformAction ($ action, $ controller = 'default_controller)), я ошибаюсь? И если я прав, как правильно назвать эти методы?

Спасибо.

EDIT: Других уточнений

Например, у меня есть действие «editEventProducts», что пользователь может выполнять только тогда, когда он является владельцем события и если статус события < = 2.

проверить что в моем контроллере функция isAuthorized работает как шарм.

Но у меня есть страница под названием «eventDetails», форма которой вы можете выполнять несколько действий, таких как этот, и я хочу показать кнопку редактирования, только если вы можете это сделать.

Если факт, что мне нужно, является результатом функции «isAuthorized» для каждого действия, которое вы можете вызвать, но могу ли я правильно его получить из представления?

Решение

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

App::uses('AppHelper', 'View/Helper'); 

class AuthHelper extends AppHelper { 

var $helpers = array('Session'); 

private $_whitelist = array(
    'controller1' => array(
     'events' => array(
      'action1'  => array(1 => true, 2 => true), 
      'action2'  => array(1 => true, 2 => true), 
      'action3'  => array(3 => true), 
      'action4'  => array(6 => true) 
     ) 
    ), 
    'user' => array(
     'controller1' => array(
      'action1'  => array(1 => true, 2 => true), 
      'action2'  => array(1 => true, 2 => true) 
     ) 
    ) 
); 

public function canPerformAction ($action, $event_infos, $controller = 'events') { 
    return isset($this->_whitelist[$this->Session->read('Auth.User.role')][$controller][$action][$event_infos['Event']['state_id']]); 
} 
} 
+0

Как эти права сохраняются в настоящее время? Это важно для правильного ответа. Это таблица «user_rights»? – mark

+0

В настоящее время это делается в canEditEvent, canAddProducts, isAdmin серии функций, которые я вызываю в своем контроллере, а затем отправляю на просмотр. Но я действительно думал об помощнике Auth, с правами таблицы и функцией, возвращающей соответствующие true/false и false, если они не найдены в таблице. Но я хотел бы знать, если это лучший способ сделать это, в идее MVC. – nicolecoco02

ответ

1

Что вам нужно, это называется авторизации, и процесс выдачи/отказа в акции, как правило, построены на вершине аутентификации шаг, который отображает HTTP запросов логических пользователей.

Схема авторизации может быть реализована несколькими способами, например, с помощью простых правил на основе ролей, где пользователи сгруппированы точно для назначения прав или с более сложными списками контроля доступа (ACL). Оба могут быть приняты одновременно для разных частей системы в зависимости от ваших потребностей.

Какую бы схему вы ни выбрали, вам абсолютно необходимо запросить ее в начале действий ваших контроллеров (если применимо, вы можете и со стандартным фильтром авторизации в своем AppController), потому что HTTP-запрос не требуется от ранее отправленной страницы HTTP, но может быть (возможно) вредоносной, ручной. Кроме того, вам, скорее всего, придется настроить пользовательский интерфейс после прав пользователя. Возможно, вам лучше начать с кучи операторов if, а затем после нескольких дней работы вы сможете определить свои потребности и собрать свои библиотеки/помощники/блоки/все, чтобы избежать дублирования кода и облегчения чтения шаблонов.

+0

Спасибо за ваш ответ. Я проверяю эти права. На самом деле проблема здесь не здесь, я постараюсь быть более ясной. Например, у меня есть действие «editEventProducts», которое пользователь может выполнить, только если он является владельцем события, и если статус события равен <= 2. Я проверяю, что в моем контроллере функция isAuthorized работает как шарм. Но у меня есть страница под названием «eventDetails», форма, в которой вы можете выполнять несколько действий, таких как этот, и я хочу показать кнопку редактирования, только если вы можете это сделать. Если факт, что мне нужно, является результатом функции «isAuthorized», вы правы, но могу ли я правильно получить его из представления? – nicolecoco02

+0

Чем меньше логики в представлении, тем лучше. Я думаю, что одним из возможных подходов будет проверка прав пользователя в действии 'eventDetails' и отправка представления в белый список действий, которые могут быть выполнены.Таким образом, представление не должно запрашивать сам уровень авторизации. Затем шаблон будет проверять белый список, чтобы решить, нарисовать ли кнопки. Белый список может быть массивом символов или просто булевыми флагами на вашем представлении, например '$ canDoThis',' $ canDoThat' и т. Д. – Raffaele

+0

О, неплохо. Вы имеете в виду, что я посылаю, например, список действий, которые может выполнить зарегистрированный пользователь на основе ключей, и я проверяю, например, что делать isset? Вы думаете, что это лучше, чем вызов пользовательского помощника? – nicolecoco02

-2

вы можете вызвать функцию контроллера с точкой зрения использования

requestAction(string $url, array $options) 

Или вы можете создать свою собственную Помощь er, который сделает это за вас!

+1

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

+0

Создайте одно действие в AppController, которое вызывается в функции beforAction() и устанавливает там свои права. .. – Anubhav

+0

Всегда есть возможность для улучшения ... нет ничего лучше, чем – Anubhav

0

Если у вас есть предопределенные разрешения пользователя (например, «admin», «moderator», «editor», «publisher» ...), вы можете просто прочитать роль пользователя, а текущее действие в функции контроллера isAuthorized и установить его правда или ложь.

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

Мое решение это отдельная таблица user_permissions, что было что-то вроде этого:

user_id | action 

, где действие будет `контроллер/действие» или „вид/блок“ или что вы хотите, чтобы сохранить там.

Я бы прочитал все значения для текущего пользователя в контроллере, и если текущий контроллер/действие было найдено в массиве, я бы установил isAuthorized в true. Вы также можете применить свою логику к блокам.

2

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

Проверьте это AuthHelper, это позволяет проверить, вошел ли пользователь в систему, для роли или набора ролей в поле. В качестве альтернативы можно реализовать собственное решение, соответствующее вашей системе разрешений.

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

Вот пример взят из его documentation:

if ($this->Auth->isLoggedIn()) { 
    echo __('Hello %s!', $this->Auth->user('username')); 
} 

if ($this->Auth->isMe($record['Record']['user_id']) { 
    // or your edit button here 
    echo '<h2>' . __('Your records') . '</h2>'; 
} 

if ($this->Auth->hasRole('admin') { 
    echo $this->Html->link(__('delete'), array('action' => 'delete')); 
} 
+0

Да, я думаю, что это определенно лучший вариант. Это немного разочаровывает, потому что это точно та же логика, что и функция «isAuthorized». – nicolecoco02

+0

Вы можете сделать это в контроллере с чем-то вроде 'if ($ this-> Auth-> role ('admin')) {$ this-> set ('admin', true); } ', а затем проверить' $ admin' в представлении. Но «AuthHelper» выглядит намного лучше. –

+0

Ну, вам нужно установить его на роль, а затем в представлениях, которые вы должны проверить, например if (isset ($ admin) && $ admin === true)). Помощник помогает уменьшить количество кода, который вы должны написать. Также он инкапсулирует логику проверки. Если вашему приложению нужно что-то особенное, просто расширьте его и загрузите свой собственный AuthHelper с псевдонимом как помощник Auth. – burzum

Смежные вопросы