在Yii2上编写自定义身份验证机制的最佳实践

时间:2015-07-02 07:36:50

标签: php yii2

我需要为我的Web应用程序编写一个非常具体的身份验证。一边有API接受登录+密码对并返回结果(和一个令牌)。除了我从API获得的登录令牌之外,我不想在Yii2端存储任何登录信息。这必须是我授权我的客户的唯一方式(所以我不使用类似OAuth的应用程序)。

在Yii2中覆盖“经典”代码的最佳实践是什么?只需使用过滤器并修改用户模型? 例如:

首先,我收到一个令牌并将其保存在会话的某个地方:

$token = GatewayAPI::login($user, $password);

然后,我所做的每个内部请求都将如下所示:

$result = GatewayAPI::addPosition($token, $data);

所以,我没有任何数据库可以使用,只是缓存和内存。几乎所有内容都在API端处理。

我的任务是实施登录检查 - 如果从API收到令牌 - 那么它被认为是成功的。并存储该令牌以便在当前会话中使用(可能在memcache中,不得向公众开放)。

1 个答案:

答案 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);
相关问题