我需要为我的Web应用程序编写一个非常具体的身份验证。一边有API接受登录+密码对并返回结果(和一个令牌)。除了我从API获得的登录令牌之外,我不想在Yii2端存储任何登录信息。这必须是我授权我的客户的唯一方式(所以我不使用类似OAuth的应用程序)。
在Yii2中覆盖“经典”代码的最佳实践是什么?只需使用过滤器并修改用户模型? 例如:
首先,我收到一个令牌并将其保存在会话的某个地方:
$token = GatewayAPI::login($user, $password);
然后,我所做的每个内部请求都将如下所示:
$result = GatewayAPI::addPosition($token, $data);
所以,我没有任何数据库可以使用,只是缓存和内存。几乎所有内容都在API端处理。
我的任务是实施登录检查 - 如果从API收到令牌 - 那么它被认为是成功的。并存储该令牌以便在当前会话中使用(可能在memcache中,不得向公众开放)。
答案 0 :(得分:2)
事实上,Yii2在任何地方都不需要登录/密码。
如果您的意思是\yii\web\User
,则无需修改或扩展用户模型。
您需要创建自己的实现IdentityInterface的类,并在配置userIdentity
中将此类设置为components->user->identityClass
:
[
'components' => [
'user' => [
'class' => 'yii\web\User', // not necessary, this is by default
'identityClass' => 'my\namespace\User'
]
]
]
界面中有5种方法,它们与登录/传递无关。您的这类可以在您的数据库中存储您想要的所有内容。 例如,您可以将任何流行的用户模块复制到您的项目中,从该用户模型中删除与登录/通过存储和搜索相关的所有内容,并添加您的API功能 - 它将起作用。
UPD。 您添加的功能如下所示:
$token = GatewayAPI::login($user, $password);
$user = \my\namespace\User::findOne(['token' => $token]);
Yii::$app->user->login($user);