Авторизация с БД без ролей и прочего
Добавлено: 2014.11.25, 16:11
Добрый день уважаемые форумчане.
Мучаюсь с авторизацией пользователей. Вместо demo/demo, admin/admin пытаюсь подключить к бд. Тема уже исхудавшая, читал предыдущие посты, а так же разные разделы документации (всё что касается авторизации), и всё равно кое-что не уловил.
Никакой ошибки у меня нет, но пользователь просто не залогинивается, пишет "Неправильный логин или пароль".
Модель регистрации:
Подскажите пожалуйста, что я упустил? Уже много времени убил, но сам не смог додуматься.
Вобщем прошел дальше..Если в UserIdentity делать не так
[/color]
а так, то при вводе пароля который в бд не хеширован, авторизация проходит. Значит я что-то не правильно делаю с хешированием. Можно ли хешировать пароль в beforSave и правильно ли это? Как по человечески сделать валидацию на хешированный пароль путем CPasswordHelper::...??
Мучаюсь с авторизацией пользователей. Вместо demo/demo, admin/admin пытаюсь подключить к бд. Тема уже исхудавшая, читал предыдущие посты, а так же разные разделы документации (всё что касается авторизации), и всё равно кое-что не уловил.
Никакой ошибки у меня нет, но пользователь просто не залогинивается, пишет "Неправильный логин или пароль".
Код: Выделить всё
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe;
private $_identity;
public function rules()
{
return array(
// username and password are required
array('username, password', 'required'),
// rememberMe needs to be a boolean
array('rememberMe', 'boolean'),
// password needs to be authenticated
array('password', 'authenticate'),
);
}
public function attributeLabels()
{
return array(
'rememberMe'=>'Remember me next time',
);
}
public function authenticate($attribute,$params)
{
if(!$this->hasErrors())
{
$this->_identity=new UserIdentity($this->username,$this->password);
if(!$this->_identity->authenticate())
$this->addError('password','Неправильный логин или пароль');
}
}
public function login()
{
if($this->_identity===null)
{
$this->_identity=new UserIdentity($this->username,$this->password);
$this->_identity->authenticate();
}
if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
{
$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($this->_identity,$duration);
return true;
}
else
return false;
}
}
Код: Выделить всё
class UserIdentity extends CUserIdentity
{
private $_id;
public function validatePassword($password)
{
return CPasswordHelper::verifyPassword($password,$this->password);
}
public function authenticate()
{
$username=strtolower($this->username);
$user=monsters::model()->find('LOWER(username)=?',array($username));
if($user===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
else if(!$user->validatePassword($this->password))
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
$this->_id=$user->id;
$this->username=$user->username;
$this->errorCode=self::ERROR_NONE;
}
return $this->errorCode==self::ERROR_NONE;
}
public function getId()
{
return $this->_id;
}
Код: Выделить всё
class Monsters extends CActiveRecord
{
public $verifyCode;
public function tableName()
{
return 'monsters';
}
public function rules()
{
return array(
array('username, password, email', 'required'),
array('username, password, email', 'length', 'min'=>4, 'max'=>32),
array('email', 'email', 'message'=>'Вы не корректно ввели e-mail адрес'), // вывод своего сообщения об ошибке
array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
//array('id, login, password, email', 'safe', 'on'=>'search'),
);
}
//...
protected function beforeSave() // Хэш пароля
{
if(parent::beforeSave())
{
if($this->isNewRecord)
{
$hash_pass = CPasswordHelper::hashPassword($this->password);
$this->password = $hash_pass;
}
return true;
}
return false;
}
public function actionRegistration() {
$q=new Monsters;
if(isset($_POST['Monsters'])) {
$q->attributes=$_POST['Monsters'];
$q->username=$_POST['Monsters']['username'];
$q->email=$_POST['Monsters']['email'];
if($q->verifyCode=$_POST['Monsters']['verifyCode']){
$q->save();
}
}
}
}
Вобщем прошел дальше..Если в UserIdentity делать не так
Код: Выделить всё
public function authenticate()
{
$username=strtolower($this->username);
$user=monsters::model()->find('LOWER(username)=?',array($username));
if($user===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
Код: Выделить всё
else if(!$user->validatePassword($this->password))
Код: Выделить всё
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
$this->_id=$user->id;
$this->username=$user->username;
$this->errorCode=self::ERROR_NONE;
}
return $this->errorCode==self::ERROR_NONE;
}
а так
Код: Выделить всё
public function authenticate(){
// Производим стандартную аутентификацию, описанную в руководстве.
$user = monsters::model()->find('LOWER(username)=?', array(strtolower($this->username)));
if(($user===null) || (($this->password)!==$user->password)) {
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else {
$this->_id = $user->id;
$this->username = $user->username;
$this->errorCode = self::ERROR_NONE;
}
return !$this->errorCode;
}