cakephp 中前端用户和管理员的单独身份验证 3.x
Separate authentication for front-end user and admin in cakephp 3.x
我们正在做一个有 4 个角色的项目。但在 cakephp 3.x 中,Auth 组件在使用 Auth.User 索引使用
的会话中保存验证用户数据
$this->Auth->setUser($user);
因此,出于某种原因,我们无法从管理面板访问前端用户帐户,因为当我们从管理面板登录到前端用户时,前端登录操作会执行并覆盖会话值。
因此,如果有任何处理此问题的流程,请建议我们。
提前致谢。
查看此精选的 CakePHP 插件列表中的 Authentication and Authorization 部分。
例如,您可以使用 dereuromarks TinyAuth Plugin 来授权您的用户并配置他们可以看到的内容。
这样您就可以使用 same 身份验证(注意 differences between Authentication and Authorization)和 same 用户 table,这将防止您提到的 Session
冲突。
Auth 组件会覆盖之前的 session,因为它一直将 session 存储在 Auth.users 中,所以我们必须为不同的角色更改 session 密钥。
如果您使用 URL 前缀来访问不同的角色,那么您可以这样做。
AppController.php
public function beforeFilter(Event $event)
{
if($this->request->params['prefix']){
$this->Auth->config('storage', [
'key'=>'Auth.'.$this->request->params['prefix'],
'className'=>'Session'
]);
}
return parent::beforeFilter($event); // TODO: Change the autogenerated stub
}
这将根据您的需要在 Auth 中创建不同的角色。
session 会像这样
[
'Auth'=>[
'User'=>['id'=>''],
'Admin'=>['id'=>''],
]
]
测试过,对我来说效果很好。
另外我了解到您没有使用前缀来管理后端和前端用户那么您可能为后端使用了单独的文件夹结构,可以吗?
你是对的,$this->Auth->setUser($user);
总是与 Auth.User
索引保持会话。所以你需要为后端编写不同的会话索引,你可以这样做:
对于后端用户身份验证:
**
$this->loadComponent('Auth', [
'authorize' => ['Controller'], // Added this line
'loginRedirect' => [
'controller' => 'Users',
'action' => 'dashboard',
'prefix' => 'admin_panel'
],
'logoutRedirect' => [
'controller' => 'Users',
'action' => 'login',
'prefix' => 'admin_panel'
],
'storage' => [
'className' => 'Session',
'key' => 'Auth.Admin',
]
]);
**
在这里您可以在 'storage' 数组键值中传递您想要的索引。
我想这对你有用。
我们正在做一个有 4 个角色的项目。但在 cakephp 3.x 中,Auth 组件在使用 Auth.User 索引使用
的会话中保存验证用户数据$this->Auth->setUser($user);
因此,出于某种原因,我们无法从管理面板访问前端用户帐户,因为当我们从管理面板登录到前端用户时,前端登录操作会执行并覆盖会话值。
因此,如果有任何处理此问题的流程,请建议我们。
提前致谢。
查看此精选的 CakePHP 插件列表中的 Authentication and Authorization 部分。
例如,您可以使用 dereuromarks TinyAuth Plugin 来授权您的用户并配置他们可以看到的内容。
这样您就可以使用 same 身份验证(注意 differences between Authentication and Authorization)和 same 用户 table,这将防止您提到的 Session
冲突。
Auth 组件会覆盖之前的 session,因为它一直将 session 存储在 Auth.users 中,所以我们必须为不同的角色更改 session 密钥。
如果您使用 URL 前缀来访问不同的角色,那么您可以这样做。
AppController.php
public function beforeFilter(Event $event)
{
if($this->request->params['prefix']){
$this->Auth->config('storage', [
'key'=>'Auth.'.$this->request->params['prefix'],
'className'=>'Session'
]);
}
return parent::beforeFilter($event); // TODO: Change the autogenerated stub
}
这将根据您的需要在 Auth 中创建不同的角色。 session 会像这样
[
'Auth'=>[
'User'=>['id'=>''],
'Admin'=>['id'=>''],
]
]
测试过,对我来说效果很好。
另外我了解到您没有使用前缀来管理后端和前端用户那么您可能为后端使用了单独的文件夹结构,可以吗?
你是对的,$this->Auth->setUser($user);
总是与 Auth.User
索引保持会话。所以你需要为后端编写不同的会话索引,你可以这样做:
对于后端用户身份验证: **
$this->loadComponent('Auth', [
'authorize' => ['Controller'], // Added this line
'loginRedirect' => [
'controller' => 'Users',
'action' => 'dashboard',
'prefix' => 'admin_panel'
],
'logoutRedirect' => [
'controller' => 'Users',
'action' => 'login',
'prefix' => 'admin_panel'
],
'storage' => [
'className' => 'Session',
'key' => 'Auth.Admin',
]
]);
**
在这里您可以在 'storage' 数组键值中传递您想要的索引。 我想这对你有用。