Я хотел бы знать, как иметь дело ТОЛЬКО С ОДНИМ процессом аутентификации и "пользователями" в нескольких таблицах. У меня есть 4 таблицы Users: пользователи, администраторы, художники, teamadmins, который у всех есть определенные поля, но я хотел бы, чтобы все эти пользователи смогли соединиться только через одну форму на домашней странице, и перенаправляемый после этого к их определенным панелям инструментов.
Я думаю, что перенаправления не должны быть проблемой, и некоторые добавленные маршруты должны работать, но я действительно не знаю, где смотреть/начинать к ake это все возможное.
Удачи,
Nicolas.
Править: вот конечное решение (благодаря 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
}
}
AuthComponent
CakePHP поддерживает аутентификацию только для одной модели «Пользователь» за раз. Модель выбирается установкой свойства 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, если вы не используете этот трюк .