CakePHP 3.5 Auth 使用多个表
CakePHP 3.5 Auth use multiple tables
我有一个 Auth 过程,它适用于一个 userModel。但不仅因为我的数据库架构,我还需要 一个登录名 method/action,它适用于多个模型 。
到目前为止,我已经尝试了我能想到的或在网上找到的所有方法 - 例如将 this Cake 1.3 solution 编辑到 Cake 3 中以及我能找到的更多提示。
但是,我想不通。
感谢您的回答。
我的 AppController 组件加载:
$this->loadComponent('ExtendedAuth', [
'authenticate' => [
'Form' => [
//'userModel' => 'Admins',
'fields' => [
'username' => 'email',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Admins',
'action' => 'login'
],
// If unauthorized, return them to page they were just on
'unauthorizedRedirect' => $this->referer(),
]);
我的 ExtendedAuthComponent:
class ExtendedAuthComponent extends AuthComponent
{
function identify($user = null, $conditions = null) {
$models = array('Admins', 'Users');
foreach ($models as $model) {
//$this->userModel = $model; // switch model
parent::setConfig('authenticate', [
AuthComponent::ALL => [
'userModel' => $model
]
]);
$result = parent::identify(); // let cake do its thing
if ($result) {
return $result; // login success
}
}
return null; // login failure
}
}
EDIT1:情况描述
我有两个独立的 table(管理员、用户)。我只需要一个尝试在用户之前使用管理员 table 的登录操作。由于应用程序逻辑,我无法将它们组合成一个 table 并带有 'is_admin' 标志。所以基本上我需要的不是在 Auth 配置中设置一个特定的 userModel,而是需要一组模型。听起来很简单,但我做不到。
EDIT2:选择的解决方案
根据下面的回答,我决定更新我的架构。 Auth 用户 table 只是简化了 table 登录凭据和角色,然后其他角色特定字段位于单独的 table 中,用作其他角色特定 [=45] 的连接=]秒。尽管答案并不完全是所问问题的解决方案,但它让我更多地考虑架构的任何可能更改,因此我找到了这个解决方案,所以我将其标记为解决方案。我也感谢所有评论。
正如 Mark 在评论中所说:不要使用两个用户表。如果 admin_profiles 和 user_profiles.
不同,则在单独的表中添加类型字段或角色或其他任何内容和相关数据
不要扩展 Auth 组件。我不建议再以任何方式使用它,因为它将在即将发布的 3.7 / 4.0 版本中被弃用。 Use the new official authentication and authorization 个插件。
如果你坚持不走弯路,想让你的生活更艰难,那就去做吧,但你仍然不应该扩展 auth 组件,而是编写一个自定义的身份验证适配器。这是实现自定义 2-table-weirdness 的正确位置。 Read this section of the manual 如何操作。
我有一个 Auth 过程,它适用于一个 userModel。但不仅因为我的数据库架构,我还需要 一个登录名 method/action,它适用于多个模型 。
到目前为止,我已经尝试了我能想到的或在网上找到的所有方法 - 例如将 this Cake 1.3 solution 编辑到 Cake 3 中以及我能找到的更多提示。
但是,我想不通。
感谢您的回答。
我的 AppController 组件加载:
$this->loadComponent('ExtendedAuth', [
'authenticate' => [
'Form' => [
//'userModel' => 'Admins',
'fields' => [
'username' => 'email',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Admins',
'action' => 'login'
],
// If unauthorized, return them to page they were just on
'unauthorizedRedirect' => $this->referer(),
]);
我的 ExtendedAuthComponent:
class ExtendedAuthComponent extends AuthComponent
{
function identify($user = null, $conditions = null) {
$models = array('Admins', 'Users');
foreach ($models as $model) {
//$this->userModel = $model; // switch model
parent::setConfig('authenticate', [
AuthComponent::ALL => [
'userModel' => $model
]
]);
$result = parent::identify(); // let cake do its thing
if ($result) {
return $result; // login success
}
}
return null; // login failure
}
}
EDIT1:情况描述
我有两个独立的 table(管理员、用户)。我只需要一个尝试在用户之前使用管理员 table 的登录操作。由于应用程序逻辑,我无法将它们组合成一个 table 并带有 'is_admin' 标志。所以基本上我需要的不是在 Auth 配置中设置一个特定的 userModel,而是需要一组模型。听起来很简单,但我做不到。
EDIT2:选择的解决方案
根据下面的回答,我决定更新我的架构。 Auth 用户 table 只是简化了 table 登录凭据和角色,然后其他角色特定字段位于单独的 table 中,用作其他角色特定 [=45] 的连接=]秒。尽管答案并不完全是所问问题的解决方案,但它让我更多地考虑架构的任何可能更改,因此我找到了这个解决方案,所以我将其标记为解决方案。我也感谢所有评论。
正如 Mark 在评论中所说:不要使用两个用户表。如果 admin_profiles 和 user_profiles.
不同,则在单独的表中添加类型字段或角色或其他任何内容和相关数据不要扩展 Auth 组件。我不建议再以任何方式使用它,因为它将在即将发布的 3.7 / 4.0 版本中被弃用。 Use the new official authentication and authorization 个插件。
如果你坚持不走弯路,想让你的生活更艰难,那就去做吧,但你仍然不应该扩展 auth 组件,而是编写一个自定义的身份验证适配器。这是实现自定义 2-table-weirdness 的正确位置。 Read this section of the manual 如何操作。