在tp中,常使用(tp3.2的时候,其他版本实现方式未知)一个 BaseController,在其 initialize 的方法中,判断$_SESSION 是否登录,如果没有则跳转到 LoginController中,那么在Yii2中该如何实现登录呢?
下面以 backend 应用为例。
第一步,配置认证class
https://www.yiichina.com/doc/guide/2.0/security-authentication
// backend/config/main.phpreturn ['components' => ['user' => [// 此类意味着,使用哪个表的记录作为登录会员class// 比如 后台使用 admin// 前台就使用 user// 所以此处配置的是Admin'identityClass' => 'common\models\Admin',],],];
第二步,Admin实现接口
https://www.yiichina.com/doc/guide/2.0/security-authentication#implementing-identity
作为一个认证的class,并不是简单的继承 ActiveRecord就可以,还需要实现相关的接口
<?phpuse yii\db\ActiveRecord;use yii\web\IdentityInterface;class Admin extends ActiveRecord implements IdentityInterface{public static function tableName(){return 'user';}/*** 根据给到的ID查询身份。** @param string|integer $id 被查询的ID* @return IdentityInterface|null 通过ID匹配到的身份对象*/public static function findIdentity($id){return static::findOne($id);}/*** 根据 token 查询身份。** @param string $token 被查询的 token* @return IdentityInterface|null 通过 token 得到的身份对象*/public static function findIdentityByAccessToken($token, $type = null){return static::findOne(['access_token' => $token]);}/*** @return int|string 当前用户ID*/public function getId(){return $this->id;}/*** @return string 当前用户的(cookie)认证密钥*/public function getAuthKey(){return $this->auth_key;}/*** @param string $authKey* @return boolean if auth key is valid for current user*/public function validateAuthKey($authKey){return $this->getAuthKey() === $authKey;}}
第三步,登录该怎么写
<?php// 可参考 advanced 版本中的LoginModel// 接收前台传递的账号密码// 根据账号查找管理员是否存在$admin = Admin::findOne(['name' => $name;]);// 比对用户密码是否一致if (!Yii::$app->security->validatePassword($password, $admin->password)){// 用户名或者密码错误}// 登录// https://www.yiichina.com/doc/guide/2.0/security-authentication#using-user// 管理员登录Yii::$app->user->login($admin);// ------------------------------------------------------------------------//// 如何获取当前登录的数据呢// 注意:其中的 Yii::$app->user 并非指的表 user,而是user组件,也就是这个是一个管理中心,// 其代表的是 认证class的登录实例。// 当前用户的身份实例。未认证用户则为 Null 。$identity = Yii::$app->user->identity;// 当前用户的ID。 未认证用户则为 Null 。$id = Yii::$app->user->id;// 判断当前用户是否是游客(未认证的)$isGuest = Yii::$app->user->isGuest;
第四步,权限如何拦截
https://www.yiichina.com/doc/guide/2.0/security-authorization#access-control-filter
也是写一个BaseController,所有需要的 controller 都继承与此,就可以实现权限拦截了,更多细节请参考文档。
// 允许所有访客(还未经认证的用户)执行 login 和 signup 动作。// roles 选项包含的问号 ? 是一个特殊的标识,代表”访客用户”。// 允许已认证用户执行 logout 动作。@是另一个特殊标识, 代表”已认证用户”。use yii\web\Controller;use yii\filters\AccessControl;class BaseController extends Controller{public function behaviors(){return ['access' => ['class' => AccessControl::className(),'rules' => [['allow' => true,'roles' => ['@'],],],],];}}
