isAuthorized перенаправление URL CakePHP - PullRequest
4 голосов
/ 01 марта 2012

Когда isAuthorized = false пользователь перенаправлен на '/', есть ли способ изменить это.Я хочу перенаправить на панель пользователя (/ users / dashboard) с сообщением «Доступ запрещен» или что-то в этом роде.

Ура!

public function isAuthorized($user) {
    if (isset($user['role']) && $user['role'] === 'admin') {
        return true; //Admin can access every action
    }
    return false; // The rest don't
}

Ответы [ 6 ]

1 голос
/ 16 декабря 2013

Я думаю, что лучший способ - использовать исключение и расширять его так:

AppController.php

 public function isAuthorized($user) {
    throw new ForbiddenException(__('You are not authorized to access.'));
 }

AnotherController.php

public function isAuthorized($user) {
    if (isset($user['role']) && $user['role'] === 'admin') {
        return true;
    }
    return parent::isAuthorized($user);
}

С этим кодомВы можете управлять ролями и ошибками.

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

Если ваша переменная isAuthorised проверяется в вашем контроллере.

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

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

Если вы уже находитесь внутри контроллера пользователя, просто наберите

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

Если нет, где вы проверяете значение isAuthorised?

Это не идеальное решение. Однако, похоже, что это невозможно сделать с помощью текущего встроенного AuthComponent

Редактировать: добавлен код в качестве примера.

public function isAuthorized($user) {
if (parent::isAuthorized($user)) {
    return true;
}
// Authorised actions
if (in_array($this->action, array('dashboard'))) {
    return true;
}
// Will break out on this call
$this->redirect(array('controller' => 'users', 'action' => 'dashboard'));
return false;
}
0 голосов
/ 05 марта 2015

Для Cake версии 2, как написано в документации для AuthComponent :

AuthComponent :: $ unauthorizedRedirect

Управляет обработкой несанкционированного доступа. По умолчанию неавторизованный пользователь перенаправляется на URL реферера или AuthComponent :: $ loginRedirect или or / ’ Если установлено значение false, исключение ForbiddenException генерируется вместо перенаправления.

Вы можете настроить AuthComponent для перенаправления на пользовательскую страницу в одном месте, используя свойство unauthorizedRedirect. Просто установите его в том месте, где вы настраиваете Auth как компонент

'Auth' => array(

     ... other settings...,

    'unauthorizedRedirect' => '/users/dashboard'
)

После перенаправления вы можете напечатать сообщение об ошибке, определенное authError property

echo $this->Session->flash();
echo $this->Session->flash('auth');

но это будет то же сообщение для любой ошибки аутентификации или авторизации.

0 голосов
/ 28 мая 2014

Я немного лучше, чем @ deep55.

Метод isAuthorized () не может вызвать исключение без проблем, но я думаю, что наследование контроллеров позволило бы нам улучшить алгоритм авторизации, используя первый AppController.isAuthorized.(), не последний.

Итак, вот мое решение, предполагающее, что я использую пользовательскую модель с именем Utilisateur и образец для подражания с именем Роль.

AppController:

/**
 * Parent method
 */
    public function isAuthorized($user){
        App::uses('Utilisateur','Model');
        $User = new Utilisateur();
        $isAdmin = $User->hasRole(10,$user['id']);
        if ($isAdmin) {
            return true;                
        }

    }
/**
 * Reject unauthorized actions
 */
    public function rejectRequest(){
        $errorMessage = __("Sorry, you can't do this.");
        if ($this->isRest()) {
            throw new ForbiddenException($errorMessage);
        } else {
            $this->Auth->authError = $errorMessage;
            $this->Auth->flash['params']['class'] = 'alert-danger';                
        }
        return false ;
    }

Модель Utilisateur:

/**
 * hasRole method return true if the user belongs to the correct role group
 */
    public function hasRole($role_id, $user_id){
        if (!isset($user_id)) {
            if (!empty($this->id)) {
                $user_id = $this->id ;
            } else throw new Exception("Error, parameter $user_id is missing", 1);              
        }
        $user = $this->find('first',array(
            'conditions' => array('Utilisateur.id' => $user_id),
            'fields' => array('id'),
            'contain' => array('Role.id')
        ));
        $roles = $user['Role'];
        foreach ($roles as $r) {
            if ($role_id == $r['id']) {
                return true;
            }
        }
    }

И, наконец, в конкретном контроллере:

/**
 * Child method
 */
public function isAuthorized($user){
    if (parent::isAuthorized($user)) {
        return true;
    }

    if ( false ) {
        return true ;
    }
    if ( false ) {
        return true ;
    }

    return $this->rejectRequest() ;
}
0 голосов
/ 11 апреля 2012

Неправильное поведение AuthComponent.

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

«Ошибка» задокументирована и будет исправлена ​​в следующем выпуске.

См .: http://cakephp.lighthouseapp.com/projects/42648/tickets/591-inconsistent-redirect-behaviour-by-auth-acl

0 голосов
/ 01 марта 2012

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

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