2013-08-21 3 views
0

Iam пишет приложение с cakephp, где у меня будет админ и агенты, где они могут войти в систему. Администратор будет иметь разную компоновку от агентов. Я уже создать таблицу пользователей, где я добавил поле роли (администратор, агент), я добавил префиксы в core.phpCakephp 2.x Префикс аутентификации admin и agent

Configure::write('Routing.prefixes', array('admin','agent')); 

мне удалось создать логин и выход из системы для администратора, но до сих пор РМКО путают, как я должен продолжать все. Например, я не понимаю, как работают функции beforeFilter() и isAuthorized(). Как я могу проверить, имеет ли пользователь доступ к этой функции или нет. Также перенаправления, если кто-то попытается получить доступ к этой странице domain.com/admin, перенаправляется на страницу администрирования/входа.

Спасибо.

ответ

0

Используйте beforeFilter() для контроля доступа к каждому действию, в приведенном ниже примере позволит доступ только к просмотру и указательным действия - любые другие действия будут заблокированы:

$this->Auth->allow('view', 'index'); 

, если вы хотите разрешить доступ для всех действий в контроллере, попробуйте это в вашем перед фильтром:

$this->Auth->allow(); 

чтобы контролировать, кто имеет доступ к тому, что вы могли бы использовать простую функцию в контроллере приложения следующим образом:

protected function _isAuthorized($role_required) { 
      if ($this->Auth->user('role') != $role_required) { 
       $this->Session->setFlash("your message here..."); 
       $this->redirect("wherever you want the user to go to..."); 
      } 
    } 

В действии вашего контроллера, например. admin_delete на первой линии вы могли бы сделать следующее:

$this->_isAuthorized('admin'); 

Наконец редирект работает следующим образом:

$this->redirect(array('controller' => 'home', 'action' => 'dashboard')); 

при перенаправлении в пределах одного контроллера просто сделайте следующее:

$this->redirect('dashboard'); 

Надеюсь, это поможет.

+0

Привет и спасибо за ваш ответ. Я думаю, что сейчас это очень ясно. Не лучший ли способ проверить, имеет ли пользователь разрешение или нет, вместо проверки разрешения в каждом действии? – zihatzik

+0

Прохладный не проблема, см. Код ниже: – KevinCoder

0

Что я обычно делаю продлить контроллер App в AdminAppController и SiteController, в AdminAppController у меня есть следующий код в моем beforeFilter:

$controller = strtolower($this->params["controller"]); 
$action = strtolower($this->params["action"]); 
$crole = $this->Auth->user("role"); 
$allowed = false; 
$roles = array(

    "all"=>array("user#login","user#register","user#forgot"), 
    "admin"=>array("pages#index","pages#view") 
); 

if(in_array($controller."#".$action,$roles["all"])){ 

$allowed = true; 
}else{ 

    if(in_array($controller."#".$action,$roles[$crole])){ 
     $allowed = true; 
    } 



} 


if($allowed==false){ 
$this->setFlash("Access denied message..."); 
$this->redirect("..."); 
} 

Не знаю, если это лучшая практика, но это работает просто отлично. Обычно я ненавижу встроенную систему авторизации CakePHP.

0

Чтобы проверить размер пособия на каждую роль, я думаю, что лучше использовать Auth-> allow ([...]) для каждого контроллера.

Я считаю, что лучше проверить контроллер :: beforeFilter() с:

switch ($role) { 
    case 'admin': 
    $this->Auth->allow(...); //Allow delete 
    //notice no break; statement, so next case will execute too if admin 
    case 'manager': 
    $this->Auth->allow(...); //Allow edit 
    case default: 
    $this->Auth->allow(...); //Allow index 
} 

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