2016-02-11 3 views
1

Используя префиксы, у меня есть отдельные сеансы и логины для администраторов и пользователей. Например 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 (который открывается на новой вкладке)?

+0

Как вы отметили, что данные были перезаписаны? – ndm

+0

Я отлаживал на этом экране $ this-> Auth-> user(), и что произойдет: - оригинальная вкладка как администратор (в префиксе администратора): щелкните логин как у пользователя - открывается новая вкладка в качестве пользователя (а не в префиксе администратора), все правильно - на исходной вкладке в префиксе администратора, если я сейчас перезагрузил страницу, идентификатор пользователя будет отображаться как пользователь, а не администратор (так что теперь я был зарегистрирован в области администратора с идентификатором пользователя не администратор) – sverreg

ответ

4

OK Я думаю, что я понял, мне нужно было использовать $ this-> Auth -> __ set ('sessionKey', 'Auth.User'); перед вызовом $ this-> Auth-> config().

public function loginas($id = null) 
{ 

    $user = $this->Users->get($id, [ 
     'contain' => [] 
    ]); 

    $this->Auth->__set('sessionKey', 'Auth.User'); 

    $this->Auth->config([ 
     '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',    
     ], 
    ]); 

    $this->Auth->setUser($user->toArray()); 
    return $this->redirect([ 
     'prefix' => false, 
     'controller' => 'Pages', 
     'action' => 'home', 
    ]);  
Смежные вопросы