Authentication CakePHP 3使用多个身份验证会话“登录为”
使用前缀,我为管理员和用户提供了单独的会话和登录。例如,AppController.php具有: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
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登录到管理员区域