Last active
August 29, 2015 14:22
-
-
Save ye-fight/dbf9507debdefdc302fe to your computer and use it in GitHub Desktop.
Yii 2.0 用户模块
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace app\models; | |
use Yii; | |
use yii\base\Model; | |
/** | |
* LoginForm is the model behind the login form. | |
*/ | |
class LoginForm extends Model | |
{ | |
public $username; | |
public $password; | |
public $rememberMe = true; | |
private $_user = false; | |
/** | |
* @return array the validation rules. | |
*/ | |
public function rules() | |
{ | |
return [ | |
// username and password are both required | |
[['username', 'password'], 'required'], | |
// rememberMe must be a boolean value | |
['rememberMe', 'boolean'], | |
// password is validated by validatePassword() | |
['password', 'validatePassword'], | |
]; | |
} | |
/** | |
* Validates the password. | |
* This method serves as the inline validation for password. | |
* | |
* @param string $attribute the attribute currently being validated | |
* @param array $params the additional name-value pairs given in the rule | |
*/ | |
public function validatePassword($attribute, $params) | |
{ | |
if (!$this->hasErrors()) { | |
$user = $this->getUser(); | |
if (!$user || !$user->validatePassword($this->password)) { | |
$this->addError($attribute, 'Incorrect username or password.'); | |
} | |
} | |
} | |
/** | |
* Logs in a user using the provided username and password. | |
* @return boolean whether the user is logged in successfully | |
*/ | |
public function login() | |
{ | |
if ($this->validate()) { | |
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); | |
} else { | |
return false; | |
} | |
} | |
/** | |
* Finds user by [[username]] | |
* | |
* @return User|null | |
*/ | |
public function getUser() | |
{ | |
if ($this->_user === false) { | |
$this->_user = User::findByUsername($this->username); | |
} | |
return $this->_user; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace app\models; | |
use Yii; | |
use yii\base\NotSupportedException; | |
use yii\behaviors\TimestampBehavior; | |
use yii\db\ActiveRecord; | |
use yii\web\IdentityInterface; | |
/** | |
* 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 | |
* @property string $password write-only password | |
*/ | |
/** | |
* | |
*/ | |
class User extends ActiveRecord implements IdentityInterface | |
{ | |
const STATUS_DELETED = 0; | |
const STATUS_ACTIVE = 10; | |
public static function tableName() | |
{ | |
return '{{%user}}'; | |
} | |
public function behaviors() | |
{ | |
return [ | |
TimestampBehavior::className() | |
]; | |
} | |
public function rules() | |
{ | |
return [ | |
['status', 'default', 'value' => self::STATUS_ACTIVE], | |
['statue', 'in', 'range' => [self::STATUS_DELETED, self::STATUS_ACTIVE]] | |
]; | |
} | |
/** | |
* IdentityInterface 接口 | |
*/ | |
public static function findIdentity($id) | |
{ | |
return static::findOne([ | |
'id' => $id, | |
'status' => self::STATUS_ACTIVE | |
]); | |
} | |
/** | |
* IdentityInterface 接口 | |
*/ | |
public static function findIdentityByAccessToken($token, $type = null) | |
{ | |
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); | |
} | |
/** | |
* IdentityInterface 接口 | |
*/ | |
public function getId() | |
{ | |
return $this->getPrimaryKey(); | |
} | |
/** | |
* IdentityInterface 接口 | |
*/ | |
public function getAuthKey() | |
{ | |
return $this->auth_key; | |
} | |
/** | |
* IdentityInterface 接口 | |
*/ | |
public function validateAuthKey($authKey) | |
{ | |
return $this->getAuthKey() === $authKey; | |
} | |
/** | |
* 通过用户名找到用户 | |
* @param string $username | |
* @return static|null | |
*/ | |
public static function findByUsername($username) | |
{ | |
return static::findOne([ | |
'username' => $username, | |
'status' => self::STATUS_ACTIVE | |
]); | |
} | |
/** | |
* 通过重置密码token找到用户 | |
* @param string $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 | |
]); | |
} | |
/** | |
* 判断重置密码的Token是否已经失效 | |
* @param string $token | |
* @return boolean | |
*/ | |
public static function isPasswordResetTokenValid($token) | |
{ | |
if (empty($token)) { | |
return false; | |
} | |
$expire = Yii::$app->params['user.passwordResetTokenExpire']; | |
$parts = explode('_', $token); | |
$timestamp = (int) end($parts); | |
return $timestamp + $expire >= time(); | |
} | |
/** | |
* 验证密码 | |
* @param string $password 需验证的密码 | |
* @return boolean | |
*/ | |
public function validatePassword($password) | |
{ | |
return Yii::$app->security->validatePassword($password, $this->password_hash); | |
} | |
/** | |
* 生成加密后的密码 | |
*/ | |
public function setPassword($password) | |
{ | |
$this->password_hash = Yii::$app->security->generatePasswordHash($password); | |
} | |
/** | |
* 生成 “记住密码” 的验证串 | |
*/ | |
public function generateAuthKey() | |
{ | |
$this->auth_key = Yii::$app->security->generateRandomString(); | |
} | |
/** | |
* 生成 “重置密码” 的验证串 | |
*/ | |
public function generatePasswordResetToken() | |
{ | |
$this->password_reset_token = Yii::$app->security->generateRandomString(); | |
} | |
/** | |
* 删除 “重置密码” 的验证串 | |
*/ | |
public function removePasswordResetToken() | |
{ | |
$this->password_reset_token = null; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- ---------------------------- | |
-- Table structure for user | |
-- ---------------------------- | |
DROP TABLE IF EXISTS `user`; | |
CREATE TABLE `user` ( | |
`id` int(11) NOT NULL AUTO_INCREMENT, | |
`username` varchar(255) COLLATE utf8_unicode_ci NOT NULL, | |
`auth_key` varchar(32) COLLATE utf8_unicode_ci NOT NULL, | |
`password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL, | |
`password_reset_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, | |
`status` smallint(6) NOT NULL DEFAULT '10', | |
`created_at` int(11) NOT NULL, | |
`updated_at` int(11) NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment