Authentication CakePHP 3使用多个身份验证会话“登录为”

Authentication CakePHP 3使用多个身份验证会话“登录为”,authentication,cakephp,cakephp-3.0,Authentication,Cakephp,Cakephp 3.0,使用前缀,我为管理员和用户提供了单独的会话和登录。例如,AppController.php具有: if ($this->request->prefix == 'admin') { $this->loadComponent('Auth', [ 'authenticate' => [ 'Form' => [ 'userModel' => 'Ad

使用前缀,我为管理员和用户提供了单独的会话和登录。例如,AppController.php具有:

    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的用户被重定向到admin登录区域,访问example.com的用户被重定向到user登录区域,用户可以同时登录一个、另一个或两个,而不会相互干扰

当我希望管理员能够以另一个用户的身份登录时,问题就出现了。在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。但当我使用此代码时:

public function loginas($id = null)
{

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

    $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',
    ]);     
}
我可以作为成功登录,但是它也会用普通用户详细信息覆盖现有管理会话的用户信息


我怎样才能让CakePHP 3完全独立于Auth.Admin会话,并针对在新选项卡中打开的Auth.User会话密钥设置一个新的Auth会话?

好的,我想我已经解决了这个问题,我需要使用$this->Auth->\u 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',
    ]);     

在AppController中,此代码适用于我

    use Cake\Event\Event;


    public function beforeFilter(Event $event){
          $this->Auth->sessionKey='Auth.Admin';
    }

您是如何检查数据是否被覆盖的?我正在将$this->Auth->user调试到屏幕上,结果是:-以管理员前缀中的管理员身份登录原始选项卡:单击以用户身份登录-新选项卡以用户身份打开,而不是以管理员前缀,全部正确-如果我现在重新加载页面,则在管理员前缀中的原始选项卡中,用户ID将显示为用户而不是管理员,因此我现在使用用户ID而不是管理员ID登录到管理员区域