Cakephp Auth с несколькими таблицами «Пользователи» - PullRequest
16 голосов
/ 04 июня 2010

Я хотел бы знать, как иметь дело только с ОДНИМ процессом аутентификации и «пользователями» в нескольких таблицах. У меня есть таблица «4 пользователя»: пользователи, администраторы, исполнители, teamadmins, у которых у всех есть определенные поля, но я бы хотел, чтобы все эти пользователи могли подключаться только через одну форму на домашней странице и после этого перенаправляться на свои конкретные панели.

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

Ура,
Nicolas.

РЕДАКТИРОВАТЬ : вот окончательное решение (благодаря деизелю)

App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
            $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}

Ответы [ 4 ]

20 голосов
/ 04 июня 2010

CakePHP AuthComponent поддерживает аутентификацию только для одной модели «Пользователь» одновременно. Модель выбирается путем установки свойства Auth::userModel , но она принимает только строку, а не массив моделей.

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

public function beforeFilter() {
    if (isset($this->data['User']['model'])) {
        $this->Auth->userModel = $this->data['User']['model'];
    }
}

Скорее всего, ядро ​​AuthComponent можно расширить, добавив желаемую функциональность, переписав AuthComponent::identify() метод , чтобы он зацикливался и пытался выполнить аутентификацию для каждой модели:

App::import('Component', 'AuthComponent');
class AppAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist', 'TeamAdmin');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $result = parent::identify($user, $conditions); // let cake do it's thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}

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

2 голосов
/ 17 июля 2011

Несмотря на раздражение, я думаю, что лучшим решением, вероятно, является использование встроенной поддержки ACL в Cake (см. http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html).

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

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

Я только что сам прошел через процесс ...: (

0 голосов
/ 14 октября 2014

Вот окончательное решение, предложенное Деизелем и измененное Николасом:

App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
            $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}
0 голосов
/ 01 июня 2013

это тоже возможно

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->authenticate = array(
        AuthComponent::ALL => array('userModel' => 'AnotherModel'),
        'Form',
        'Basic'
    );
}
...