自定义用户认证规则需创建实现identityinterface接口的用户模型,配置user组件指定identityclass为自定义模型,创建登录表单模型验证用户名密码并调用login()方法完成登录;2. 用户权限和访问控制可通过rbac实现角色、权限与规则的分配,并使用can()方法检查权限,或通过accesscontrol过滤器在控制器中定义访问规则,亦可自定义逻辑进行更复杂控制;3. 实现“记住我”功能需在配置中启用enableautologin,在登录时根据rememberme设置cookie有效期,并在用户模型中实现getauthkey()和validateauthkey()方法以支持自动登录验证,auth_key需安全存储并适时更新。

YII框架的认证,简单来说,就是验证用户身份的过程,确保只有授权的用户才能访问特定的资源或功能。而用户登录则是认证流程的起点,YII提供了一套相对灵活且可扩展的机制来实现这一目标。
YII框架中,认证通常涉及验证用户的身份凭证(例如用户名和密码),并创建一个代表已认证用户的会话。用户登录则是在认证成功后,将用户信息存储到会话中,以便在后续请求中识别用户。
YII框架默认提供了一个
User
创建自定义用户模型: 继承
yii\web\IdentityInterface
getId()
getAuthKey()
validateAuthKey($authKey)
findIdentity($id)
findIdentity()
validateAuthKey()
use yii\web\IdentityInterface;
class User extends \yii\db\ActiveRecord implements IdentityInterface
{
public static function findIdentity($id)
{
return static::findOne($id);
}
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
}
public function getId()
{
return $this->id;
}
public function getAuthKey()
{
return $this->auth_key;
}
public function validateAuthKey($authKey)
{
return $this->auth_key === $authKey;
}
public static function findByUsername($username)
{
return static::findOne(['username' => $username]);
}
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
}配置 User
config/web.php
User
identityClass
'components' => [
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
],创建登录表单模型: 创建一个表单模型,用于接收用户输入的用户名和密码。
class LoginForm extends \yii\base\Model
{
public $username;
public $password;
public $rememberMe = true;
private $_user = false;
public function rules()
{
return [
[['username', 'password'], 'required'],
['rememberMe', 'boolean'],
['password', 'validatePassword'],
];
}
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, 'Incorrect username or password.');
}
}
}
public function login()
{
if ($this->validate()) {
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
}
return false;
}
protected function getUser()
{
if ($this->_user === false) {
$this->_user = User::findByUsername($this->username);
}
return $this->_user;
}
}实现登录控制器: 在控制器中,处理登录表单的提交,验证用户身份,并调用
Yii::$app->user->login()
public function actionLogin()
{
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
}
return $this->render('login', [
'model' => $model,
]);
}通过以上步骤,就可以实现自定义的用户认证规则。核心在于自定义用户模型和登录表单模型的实现,以及对
Yii::$app->user
用户认证只是第一步,更重要的是如何控制用户对不同资源的访问权限。YII框架提供了多种方式来实现访问控制,包括:
基于角色的访问控制 (RBAC): YII提供了强大的RBAC组件,可以定义角色、权限和规则,并将它们分配给用户。这是一种非常灵活和可扩展的访问控制方式。
可以通过命令行工具或者图形界面来管理RBAC规则。
./yii migrate/up --migrationPath=@yii/rbac/migrations
然后,可以在
config/web.php
authManager
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
],之后,就可以在控制器中使用
Yii::$app->user->can()
if (Yii::$app->user->can('createPost')) {
// 允许创建文章
} else {
throw new ForbiddenHttpException('You are not allowed to create posts.');
}访问控制过滤器 (Access Control Filter): YII提供了一个
AccessControl
use yii\filters\AccessControl;
use yii\web\ForbiddenHttpException;
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index', 'create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'], // @ 代表已认证用户
],
],
'denyCallback' => function ($rule, $action) {
throw new ForbiddenHttpException('You are not allowed to access this page.');
}
],
];
}AccessControl
allow
roles
@
?
自定义访问控制逻辑: 如果需要更复杂的访问控制逻辑,可以自定义过滤器或者直接在代码中进行判断。
选择哪种方式取决于项目的具体需求。RBAC 适用于需要精细化控制权限的场景,而
AccessControl
"记住我" 功能允许用户在关闭浏览器后,下次访问时自动登录。YII框架提供了内置的支持来实现这一功能。
启用 enableAutoLogin
config/web.php
User
enableAutoLogin
true
'components' => [
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
],在登录时设置 cookie 有效期: 在登录表单的
login()
rememberMe
true
public function login()
{
if ($this->validate()) {
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
}
return false;
}3600*24*30
实现 getAuthKey()
validateAuthKey()
getAuthKey()
validateAuthKey()
getAuthKey()
validateAuthKey()
public function getAuthKey()
{
return $this->auth_key;
}
public function validateAuthKey($authKey)
{
return $this->auth_key === $authKey;
}auth_key
通过以上步骤,就可以实现 "记住我" 功能。YII框架会自动处理 cookie 的设置和验证,无需手动编写代码。需要注意的是,为了安全起见,
auth_key
以上就是YII框架的认证是什么?YII框架如何实现用户登录?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号