guild/common/models/User.php

237 lines
5.4 KiB
PHP
Raw Normal View History

2018-10-11 11:15:09 +03:00
<?php
2018-10-11 11:15:09 +03:00
namespace common\models;
2022-12-01 14:11:29 +03:00
use developeruz\db_rbac\interfaces\UserRbacInterface;
2018-10-11 11:15:09 +03:00
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
2021-07-28 18:15:38 +03:00
use yii\web\UnauthorizedHttpException;
2018-10-11 11:15:09 +03:00
/**
* User model
*
* @property integer $id
* @property string $username
* @property string $password_hash
* @property string $password_reset_token
* @property string $email
* @property string $auth_key
* @property integer $status
* @property integer $created_at
* @property integer $updated_at
2021-08-03 15:52:25 +03:00
* @property $access_token_expired_at
2018-10-11 11:15:09 +03:00
* @property string $password write-only password
2023-02-21 23:08:46 +03:00
*
* @property UserCard $userCard
2018-10-11 11:15:09 +03:00
*/
2022-12-01 14:11:29 +03:00
class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
2018-10-11 11:15:09 +03:00
{
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
/**
* {@inheritdoc}
*/
public static function tableName()
{
return '{{%user}}';
}
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
['status', 'default', 'value' => self::STATUS_ACTIVE],
['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
];
}
2021-11-16 13:14:28 +03:00
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isNewRecord) {
$this->auth_key = Yii::$app->security->generateRandomString();
}
return true;
}
return false;
}
2018-10-11 11:15:09 +03:00
/**
* {@inheritdoc}
*/
public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
}
2022-12-01 14:11:29 +03:00
public function getUserName()
{
return $this->username;
}
2021-07-28 18:15:38 +03:00
public function generateAccessToken()
2018-10-11 11:15:09 +03:00
{
2021-07-28 18:15:38 +03:00
$this->access_token = Yii::$app->security->generateRandomString();
return $this->access_token;
2018-10-11 11:15:09 +03:00
}
2021-07-28 18:15:38 +03:00
public static function findIdentityByAccessToken($token, $type = null)
{
$user = static::find()->where(['access_token' => $token, 'status' => self::STATUS_ACTIVE])->one();
if (!$user) {
return false;
}
if (strtotime($user->access_token_expired_at) < time()) {
throw new UnauthorizedHttpException('the access - token expired ', -1);
} else {
return $user;
}
}
2021-08-03 15:52:25 +03:00
public function getTokenExpiredAt()
{
return $this->access_token_expired_at;
}
2018-10-11 11:15:09 +03:00
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
}
/**
* Finds user by password reset token
*
* @param string $token password reset token
* @return static|null
*/
public static function findByPasswordResetToken($token)
{
if (!static::isPasswordResetTokenValid($token)) {
return null;
}
return static::findOne([
'password_reset_token' => $token,
'status' => self::STATUS_ACTIVE,
]);
}
/**
* Finds out if password reset token is valid
*
* @param string $token password reset token
* @return bool
*/
public static function isPasswordResetTokenValid($token)
{
if (empty($token)) {
return false;
}
2021-08-03 15:52:25 +03:00
$timestamp = (int)substr($token, strrpos($token, '_') + 1);
2018-10-11 11:15:09 +03:00
$expire = Yii::$app->params['user.passwordResetTokenExpire'];
return $timestamp + $expire >= time();
}
/**
* {@inheritdoc}
*/
public function getId()
{
return $this->getPrimaryKey();
}
/**
* {@inheritdoc}
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* {@inheritdoc}
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate
* @return bool if password provided is valid for current user
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
/**
* Generates password hash from password and sets it to the model
*
* @param string $password
*/
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
/**
* Generates "remember me" authentication key
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
/**
* Generates new password reset token
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
}
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}
2021-07-28 18:15:38 +03:00
2021-09-07 16:32:57 +03:00
public function getUserCard()
{
return $this->hasOne(UserCard::class, ['id_user' => 'id']);
}
public function getProjectUser()
{
return $this->hasMany(ProjectUser::className(), ['user_id' => 'id']);
}
2018-10-11 11:15:09 +03:00
}