yii2-user

yii\web\IdentityInterface 需要被实现的方法:

  • findIdentity(),用来维护 session。
  • findIdentityByAccessToken(),RESTful application 需要使用这个方法。
  • getAuthKey(),用于 cookie-based 登录。
  • validateAuthKey(),用于 cookie-based 登录。
  • getId()

RESTful application

如果你的应用是一个 pure stateless RESTful application,那么则主需要实现:

  • findIdentityByAccessToken()
  • getId()

因为用不到 sessioncookie,对应的那些方法留空即可。

Cookie-Based(记住我) 登录应用

如果你的应用使用 cookie-based 登录特性,你只需要实现:

  • getAuthKey(),用于 cookie-based 登录。
  • validateAuthKey(),用于 cookie-based 登录。

其他方法留空即可。

需要注意的是需要增加一个 beforeSave 方法,为每个用户随机生成一个 auth_key

Logs in a user by cookie

在用户访问网站时,如果 user 组件配置的属性 enableAutoLogintrue 则会调用 yii\web\User::loginByCookie() 方法,通过 ID 和 authKey 来登录。

login

yii\web\User::login() 方法会将当前用户的身份保存在 yii\web\User 中:

  • 如果启用了 session,它会将身份存储在 session 中。
  • 如果启用了 cookie-based 登录(记住我),它会将身份存储在 cookie 中,这样只要 cookie 仍然有效,就可以恢复用户的登录状态。

logout

Yii::$app->user->logout();

记住,logout a user 只在 session 启用时有意义。logout 会从 memory 和 session 中清理用户的认证状态。

事件

  • 登录前
  • 登录后,例如,将记登录时间和 IP 地址记录到 user 表。
  • 注销前
  • 注销后
'components' =>[
    ...
    'user' => [
        'identityClass' => 'common\models\User',
        'enableAutoLogin' => true,
        'on beforeLogin' => function($event) {
            //...
        },
        'on afterLogin' => function($event) {
            $user = $event->identity; //这里的就是User Model的实例了
            $user->last_login_at = time();
            $user->save();
        }
    ],
    ...
]

登录后跳转

在登录页面记录登录前的地址就是在登录页面自己 setReturnUrl():

Yii::$app->user->setReturnUrl(Yii::$app->request->referrer);

这样登录成功才能正确跳转回去:

return $this->goBack();