CakePHP Auth с несколькими таблицами "пользователи"

Я хотел бы знать, как работать только с одним процессом аутентификации и "пользователями" в нескольких таблицах. У меня есть таблица пользователей 4: пользователи, администраторы, художники, teamadmins, у которых все есть определенные поля, но я хотел бы, чтобы все эти пользователи могли подключаться только через одну форму на главной странице и перенаправляться после этого на свои конкретные панели мониторинга.

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

спасибо,
Николас.

редактировать: вот окончательное решение (благодаря deizel)

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 ответов


в CakePHP это!--2--> поддерживает только аутентификацию против одной" пользовательской " модели одновременно. Модель выбирается путем установки 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, если вы не используете этот трюк.


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

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

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

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


это также возможность

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

вот окончательное решение, как полагают deizel и модифицированных Николя:

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
    }
}