Используя префиксы, у меня есть отдельные сеансы и логины для администраторов и пользователей. Например AppController.php имеет:CakePHP 3 «Войти как» wtih Несколько сеансов Auth
if ($this->request->prefix == 'admin') {
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'userModel' => 'Admins',
'fields' => ['username' => 'email', 'password' => 'password']
],
],
'loginAction' => [
'controller' => 'Admins',
'action' => 'login'
],
'loginRedirect' => [
'controller' => 'Admins',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Admins',
'action' => 'login',
],
'storage' => [
'className' => 'Session',
'key' => 'Auth.Admin',
],
]);
} else {
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'userModel' => 'Users',
'fields' => ['username' => 'email', 'password' => 'password']
],
],
'loginAction' => [
'controller' => 'Users',
'action' => 'login'
],
'loginRedirect' => [
'controller' => 'pages',
'action' => 'home'
],
'logoutRedirect' => [
'controller' => 'Users',
'action' => 'login',
],
'storage' => [
'className' => 'Session',
'key' => 'Auth.User',
],
]);
}
Это работает хорошо в том, что пользователи, которые посещают example.com/admin попадают в зону входа администратора, пользователи, которые посещают example.com прибудет перенаправлять области входа пользователя , и пользователи могут войти в один, другой или оба одновременно, не мешая друг другу.
Проблема возникает, когда я хочу, чтобы администраторы могли «войти» в качестве «другого пользователя». В CakePHP2 я смог это сделать:
AuthComponent::$sessionKey = 'Auth.User'; // solution from http://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session
$this->Auth->loginAction = array('admin'=>false,'controller'=>'accounts','action'=>'login');
$this->Auth->loginRedirect = array('admin'=>false,'controller'=>'pages','action'=>'home');
$this->Auth->logoutRedirect = array('admin'=>false,'controller'=>'accounts','action'=>'login');
$this->Auth->authenticate = array(
'Custom' => array(
'userModel' => 'Account',
'fields' => array('username' => 'number'),
)
);
if (!$this->Auth->login($account['Account'])) {
throw new NotFoundException(__('Could not login to account'));
}
return $this->redirect(array('admin' => false, 'controller' => 'getting_started', 'action' => 'index'));
И все работало нормально. Но в CakePHP3 свойство AuthComponent :: $ sessionKey не представляется доступным, вместо этого я думаю, что я должен использовать $ this-> Auth-> config. Но когда я использую этот код:
Я могу успешно «Войти как», однако он также перезаписывает информацию о пользователе для существующего администратора сессии с нормальной информацией о пользователях.
Как я могу заставить CakePHP 3 полностью покинуть сеанс Auth.Admin и настроить новый сеанс Auth против ключа сеанса Auth.User (который открывается на новой вкладке)?
Как вы отметили, что данные были перезаписаны? – ndm
Я отлаживал на этом экране $ this-> Auth-> user(), и что произойдет: - оригинальная вкладка как администратор (в префиксе администратора): щелкните логин как у пользователя - открывается новая вкладка в качестве пользователя (а не в префиксе администратора), все правильно - на исходной вкладке в префиксе администратора, если я сейчас перезагрузил страницу, идентификатор пользователя будет отображаться как пользователь, а не администратор (так что теперь я был зарегистрирован в области администратора с идентификатором пользователя не администратор) – sverreg