LoginForm.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace app\models\user;
  3. use dektrium\user\Finder;
  4. use dektrium\user\helpers\Password;
  5. use dektrium\user\traits\ModuleTrait;
  6. use yii\helpers\ArrayHelper;
  7. use yii\helpers\Html;
  8. use Yii;
  9. use yii\base\Model;
  10. /**
  11. * LoginForm get user's login and password, validates them and logs the user in. If user has been blocked, it adds
  12. * an error to login form.
  13. *
  14. * @author Dmitry Erofeev <dmeroff@gmail.com>
  15. */
  16. class LoginForm extends Model
  17. {
  18. use ModuleTrait;
  19. /** @var string User's email or username */
  20. public $login;
  21. /** @var string User's uuid */
  22. public $uuid;
  23. /** @var string User's plain password */
  24. public $password;
  25. /** @var string Whether to remember the user */
  26. public $rememberMe = false;
  27. /** @var User */
  28. protected $user;
  29. /** @var Finder */
  30. protected $finder;
  31. /**
  32. * @param Finder $finder
  33. * @param array $config
  34. */
  35. public function __construct(Finder $finder, $config = [])
  36. {
  37. $this->finder = $finder;
  38. parent::__construct($config);
  39. }
  40. /**
  41. * Gets all users to generate the dropdown list when in debug mode.
  42. *
  43. * @return array
  44. */
  45. public static function loginList()
  46. {
  47. /** @var \dektrium\user\Module $module */
  48. $module = \Yii::$app->getModule('user');
  49. $userModel = $module->modelMap['User'];
  50. return ArrayHelper::map($userModel::find()->where(['blocked_at' => null])->all(), 'username', function ($user) {
  51. return sprintf('%s (%s)', Html::encode($user->username), Html::encode($user->email));
  52. });
  53. }
  54. /** @inheritdoc */
  55. public function attributeLabels()
  56. {
  57. return [
  58. 'login' => Yii::t('user', 'Login'),
  59. 'uuid' => Yii::t('user', 'Nomer Dogovora'),
  60. 'password' => Yii::t('user', 'Password'),
  61. 'rememberMe' => Yii::t('user', 'Remember me next time'),
  62. ];
  63. }
  64. /** @inheritdoc */
  65. public function rules()
  66. {
  67. $rules = [
  68. 'uuidTrim' => ['uuid', 'trim'],
  69. 'requiredFields' => [['uuid'], 'required'],
  70. 'confirmationValidate' => [
  71. 'login',
  72. function ($attribute) {
  73. if ($this->user !== null) {
  74. $confirmationRequired = $this->module->enableConfirmation
  75. && !$this->module->enableUnconfirmedLogin;
  76. if ($confirmationRequired && !$this->user->getIsConfirmed()) {
  77. $this->addError($attribute, Yii::t('user', 'You need to confirm your email address'));
  78. }
  79. if ($this->user->getIsBlocked()) {
  80. $this->addError($attribute, Yii::t('user', 'Your account has been blocked'));
  81. }
  82. }
  83. }
  84. ],
  85. 'rememberMe' => ['rememberMe', 'boolean'],
  86. ];
  87. if (!$this->module->debug) {
  88. $rules = array_merge($rules, [
  89. 'requiredFields' => [['uuid', 'password'], 'required'],
  90. 'passwordValidate' => [
  91. 'password',
  92. function ($attribute) {
  93. if ($this->user === null || !Password::validate($this->password, $this->user->password_hash)) {
  94. $this->addError($attribute, Yii::t('user', 'Invalid login or password'));
  95. }
  96. }
  97. ]
  98. ]);
  99. }
  100. return $rules;
  101. }
  102. /**
  103. * Validates if the hash of the given password is identical to the saved hash in the database.
  104. * It will always succeed if the module is in DEBUG mode.
  105. *
  106. * @return void
  107. */
  108. public function validatePassword($attribute, $params)
  109. {
  110. if ($this->user === null || !Password::validate($this->password, $this->user->password_hash))
  111. $this->addError($attribute, Yii::t('user', 'Invalid login or password'));
  112. }
  113. /**
  114. * Validates form and logs the user in.
  115. *
  116. * @return bool whether the user is logged in successfully
  117. */
  118. public function login()
  119. {
  120. if ($this->validate() && $this->user) {
  121. $isLogged = Yii::$app->getUser()->login($this->user, $this->rememberMe ? $this->module->rememberFor : 0);
  122. if ($isLogged) {
  123. $this->user->updateAttributes(['last_login_at' => time()]);
  124. }
  125. return $isLogged;
  126. }
  127. return false;
  128. }
  129. /** @inheritdoc */
  130. public function formName()
  131. {
  132. return 'login-form';
  133. }
  134. /** @inheritdoc */
  135. public function beforeValidate()
  136. {
  137. if (parent::beforeValidate()) {
  138. if (filter_var($this->login, FILTER_VALIDATE_EMAIL)) {
  139. return $this->findUserByEmail($this->login);
  140. }else{
  141. $this->user = $this->finder->findUser(["uuid"=>$this->uuid])->one();
  142. }
  143. return true;
  144. } else {
  145. return false;
  146. }
  147. }
  148. }