6 use yii\base\NotSupportedException;
7 use yii\db\ActiveRecord;
8 use yii\web\IdentityInterface;
9 use yii\helpers\Security;
12 * This is the model class for table "{{%users}}".
14 * @property int $id Идентификатор записи (неизменяемое)
15 * @property string $username Имя пользователя
16 * @property string $password Пароль
18 class User extends ActiveRecord implements IdentityInterface
22 public $repeat_password;
26 public static function tableName()
34 public function rules()
37 [[ 'old_password', 'new_password', 'repeat_password' ], 'required', 'on' => 'changePassword'],
38 [[ 'old_password' ], 'findPasswords', 'on' => 'changePassword' ],
39 [[ 'repeat_password' ], 'compare', 'compareAttribute' => 'new_password', 'on' => 'changePassword' ],
40 [[ 'username', 'password' ], 'required' ],
41 [[ 'username', 'password' ], 'string', 'max' => 128 ],
42 [[ 'username' ], 'unique' ],
49 public function attributeLabels()
52 'id' => Yii::t('app', 'Identificator'),
53 'username' => Yii::t('users', 'User name'),
54 'password' => Yii::t('users', 'Password'),
55 'old_password' => Yii::t('users', 'Old password'),
56 'new_password' => Yii::t('users', 'New password'),
57 'repeat_password' => Yii::t('users', 'repeat password'),
61 // Поиск пользователя по идентификатору
62 public static function findIdentity($id)
64 return static::findOne($id);
67 // Поиск пользователя по ключу доступа
68 public static function findIdentityByAccessToken($token, $type = NULL)
70 return static::findOne([ 'access_token' => $token ]);
73 // Поиск пользователя по имени
74 public static function findByUsername($username)
76 return static::findOne([ 'username' => $username ]);
79 // Поиск пользователя по уникальному ключу сброса пароля
80 public static function findByPasswordResetToken($token)
82 $expire = \Yii::$app->params[ 'user.passwordResetTokenExpire' ];
83 $parts = explode('_', $token);
84 $timestamp = (int) end($parts);
85 if ($timestamp + $expire < time())
87 // Время токена истекло
90 return static::findOne([ 'password_reset_token' => $token ]);
93 // Получение идентификатора пользователя
94 public function getId()
99 // Получение ключа авторизации
100 public function getAuthKey()
102 return $this->auth_key;
105 // Проверка ключа авторизации
106 public function validateAuthKey($authKey)
108 return $this->getAuthKey() === $authKey;
111 public function findPasswords($attribute, $params)
113 if (! $this->validatePassword($this->old_password))
114 $this->addError($attribute, Yii::t('users', 'Old password is incorrect.'));
117 // Проверка пароля пользователя
118 public function validatePassword($password)
120 return Yii::$app->getSecurity()->validatePassword($password, $this->password);
123 // Устанока пароля пользователя
124 public function setPassword($password)
126 $this->password = Yii::$app->getSecurity()->generatePasswordHash($password);
129 // Создание уникального ключа авторизации
130 public function generateAuthKey()
132 $this->auth_key = Yii::$app->getSecurity()->generateRandomString();
135 // Создание ключа сброса пароля
136 public function generatePasswordResetToken()
138 $this->password_reset_token = utf8_encode(Yii::$app->getSecurity()->generateRandomString()) . '_' . time();
141 // Сброс ключа сброса пароля
142 public function removePasswordResetToken()
144 $this->password_reset_token = NULL;
148 public static function canPermission($permission)
150 return isset(Yii::$app->authManager->getPermissionsByUser(\Yii::$app->user->getId())[$permission]);
153 // Перед записью генерируем для новых записей уникальный ключ
154 public function beforeSave($insert)
156 if (parent::beforeSave($insert))
158 if ($this->isNewRecord)
160 $this->generateAuthKey();