2016-09-22 6 views
3

Я хотел бы авторизовать пользователей на основе нескольких ролей. Все посетители должны иметь возможность дойти до показа метода. Поэтому я написал в AppController:Авторизовать пользователей на основе ролей в CakePHP 3

public function beforeFilter(Event $event) { 
    $this->Auth->allow(['show']); 
} 

Это работает.

В Initialize() метод AppController У меня также:

$this->loadComponent('Auth', [ 
    'authorize' => 'Controller' 
]); 

Я хотел бы, чтобы зарегистрированные пользователи с ролью «пользователь», чтобы добраться до всех «индекс» и «добавить» методы, так Я написал в AppController:

public function isAuthorized($user) { 
if (isset($user['role']) && $user['role'] === 'admin') { 
return true; 
} 
if (isset($user['role']) && $user['role'] === 'user') { 
$this->Auth->allow(['index', 'logout', 'add']); 
} 

return false; 
} 

Администратор может достигать всех методов, как ожидалось. Пользователь, зарегистрированный с ролью «пользователь», не может достичь метода «индекс» или «добавить». Как я могу это исправить?

ответ

5

Вместо того, чтобы использовать вашу логику для добавления дополнительного Auth, просто используйте логику, чтобы определить, разрешено ли им действие, проверив действие и вернув true, если они авторизованы.

public function isAuthorized($user) { 

    // Admin allowed anywhere 
    if (isset($user['role']) && $user['role'] === 'admin') { 
     return true; 
    } 

    // 'user' allowed in specific actions 
    if (isset($user['role']) && $user['role'] === 'user') { 

     $allowedActions = ['index', 'logout', 'add']; 
     if(in_array($this->request->action, $allowedActions)) { 
      return true; 
     } 

    } 
    return false; 
} 

(очевидно, этот код может быть сокращен по своему вкусу, но он показывает концепцию)

+1

Эй, я до сих пор не могу голосовать, но ваш ответ мне очень помог. Спасибо! – nexequ

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

  • Нет связанных вопросов^_^