Yii:: app() → user-> isGuest всегда возвращает true, даже если логин был успешным
Я начал делать некоторые различия между теми пользователями, которые прошли аутентификацию, и теми, которые не являются. Для этого я использую
Yii::app()->user->id;
Однако в определенном виде я поставлю следующий код:
<?php
if(Yii::app()->user->isGuest) {
print("Welcome back Guest!");
print("Your id is ".Yii::app()->user->id);
} else {
print("Welcome back ".Yii::app()->user->name);
print("Your id is ".Yii::app()->user->id);
}?>
И я всегда получаю "приветствую гостей!", независимо от того, вошел ли я (успешно) или нет. И если я имеет, то он отображает приветственное сообщение вместе с идентификатором пользователя!
ИЗМЕНИТЬ
@briiC.lv
Эй.. извините за поздний ответ, надеюсь, вы все еще следуете этому! Я не расширяю данный класс UserIdentity. Это обязательно? Поскольку я до сих пор не очень хорошо разбираюсь во всей проблеме авторизации, я подумал, что лучше всего попробовать попробовать класс, который они предоставляют, а затем расширить с помощью моей собственной функциональности. В любом случае, после этого я опубликую свой класс UserIdentity с его небольшими настройками. может быть, проблема здесь?
<?php class UserIdentity extends CUserIdentity{
private $_id;
public function authenticate()
{
$user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
if(!isset($user[0]))
{
return false;
}
else
{
$this->setState('id', $user[0]->id);
$this->username = $user[0]->username;
$this->errorCode=self::ERROR_NONE;
return true;
}
}
public function getId()
{
return $this->_id;
}
}
Вот результат, который я получил, когда я начал регистрироваться, как вы предложили; Я получил этот результат сразу после успешного входа в систему.
[05:23:21.833][trace][vardump] CWebUser#1 (
[allowAutoLogin] => true
[guestName] => 'Guest'
[loginUrl] => array ( '0' => '/site/login' )
[identityCookie] => null
[authTimeout] => null
[autoRenewCookie] => false
[autoUpdateFlash] => true
[CWebUser:_keyPrefix] => '0f4431ceed8f17883650835e575b504b'
[CWebUser:_access] => array()
[behaviors] => array()
[CApplicationComponent:_initialized] => true
[CComponent:_e] => null
[CComponent:_m] => null
)
Любая помощь очень ценится!
Ответы
Ответ 1
Возможно, вы можете попробовать отлаживать больше:
измените сообщения на что-то вроде этого:
if(Yii::app()->user->isGuest) {
print("Not logged");
} else {
print_r(Yii::app()->user);
print("Welcome ".Yii::app()->user->name);
print("Your id is ".Yii::app()->user->id);
}
И проверьте переменную сеанса в файле config/main.php
...
'session' => array(
'autoStart'=>true,
),
...
Ответ 2
Ошибка находится в следующей строке
$this->setState('id', $user[0]->id);
Как видно из официальной документации yii относительно auth и auth, setState
следует использовать для чего-либо, кроме поля id. Чтобы реализовать ключ, который Yii будет использовать для идентификации вашего пользователя, верните уникальное значение для каждого пользователя в функции Identity getId()
.
В вашем случае это означает, что вам просто нужно изменить указанную выше строку следующим образом:
$this->_id = $user[0]->id;
Что касается фактической внутренней работы процедуры входа в систему, я бы рекомендовал посмотреть класс CWebUser
и особенно на его функцию входа, который отвечает за фактическое сохранение возвращаемого значения Identity getId()
.
Ответ 3
когда вы вызываете пользователя входа в функцию аутентификации как
$userIdentity = new UserIdentity($username, $password);
$userIdentity->authenticate();
if ($userIdentity->errorCode===UserIdentity::ERROR_NONE) {
Yii::app()->user->login($userIdentity,0);
}
и введите id как
echo 'id='.Yii::app()->user->getId();
применить этот код и проверить
Ответ 4
Я столкнулся с такой же проблемой и обнаружил, что только одна строка в компоненте UserIdentity решит эту проблему.
Это ваш код:
else
{
$this->setState('id', $user[0]->id);
$this->username = $user[0]->username;
$this->errorCode=self::ERROR_NONE;
return true;
}
Обновите этот код этим
else
{
$this->_id = $user[0]->id;
$this->setState('id', $user[0]->id);
$this->username = $user[0]->username;
$this->errorCode=self::ERROR_NONE;
return true;
}
Ответ 5
Прежде всего, вам нужно знать условие, которое устанавливает гостевой и входной пользователь отдельно.
Основываясь на ветке мастера Yii CWebUser:: getIsGuest():
public function getIsGuest()
{
return $this->getState('__id')===null;
}
По сравнению с вашим кодом:
$user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
if(!isset($user[0])) {
// false
} else {
$this->setState('id', $user[0]->id); // this is for persistent state sakes
...
}
}
Вкратце: вы поставили 'id' в постоянное состояние Identity, но Yii CWebUser ожидал '__id' на основе UserIdentity:: getId().
Решение довольно простое. Вам просто нужно установить $this → _ id
$user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
if(!isset($user[0])) {
// false
} else {
$this->setState('id', $user[0]->id); // this is for persistent state sakes
$this->_id = $user[0]->id; // this is UserIdentity ID that'll be fetch by CWebUser
...
}
}
Эта процедура объясняет, как CWebUser получает идентификатор UserIdentity: https://github.com/yiisoft/yii/blob/master/framework/web/auth/CWebUser.php#L221
Пожалуйста, проверьте это.
Ответ 6
Попробуйте использовать следующий код. Его хорошо работает
//config/main.php
return array (
'component' => array(
'session' => array(
'savePath' => INSTANCE_ROOT.DS.'runtime'.DS.'session',
'autoStart' => true,
),
)
);
// LoginController
class LoginController extends CController {
public function actionLogin () {
if(isset($_POST['LoginForm']))
{
$form = new LoginForm;
$form->setAttributes($_POST['LoginForm']);
if ($form->validate()) {
$user = Users::model()->find('upper(username) = :username', array(
':username' => strtoupper($form->username)));
if($user)
return $this->authenticate($user, $form);
else {
Yii::log( 'som.....', 'error');
$form->addError('password', Yii::t('Username or Password is incorrect'));
}
return false;
}
}
}
protected function authenticate($user, $form) {
$identity = new UserIdentity($user->username, $form->password);
$identity->authenticate();
switch($identity->errorCode) {
case UserIdentity::ERROR_NONE:
$duration = $form->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($identity,$duration);
return $user;
break;
case UserIdentity::ERROR_EMAIL_INVALID:
$form->addError("password",Yii::t('Username or Password is incorrect'));
break;
case UserIdentity::ERROR_STATUS_INACTIVE:
$form->addError("status",Yii::t('This account is not activated.'));
break;
case UserIdentity::ERROR_STATUS_BANNED:
$form->addError("status",Yii::t('This account is blocked.'));
break;
case UserIdentity::ERROR_STATUS_REMOVED:
$form->addError('status', Yii::t('Your account has been deleted.'));
break;
case UserIdentity::ERROR_PASSWORD_INVALID:
Yii::log( Yii::t(
'Password invalid for user {username} (Ip-Address: {ip})', array(
'{ip}' => Yii::app()->request->getUserHostAddress(),
'{username}' => $form->username)), 'error');
if(!$form->hasErrors())
$form->addError("password",Yii::t('Username or Password is incorrect'));
break;
return false;
}
}
}
class UserIdentity extends CUserIdentity {
const ERROR_EMAIL_INVALID=3;
const ERROR_STATUS_INACTIVE=4;
const ERROR_STATUS_BANNED=5;
const ERROR_STATUS_REMOVED=6;
const ERROR_STATUS_USER_DOES_NOT_EXIST=7;
public function authenticate()
{
$user = Users::model()->find('username = :username', array(
':username' => $this->username));
if(!$user)
return self::ERROR_STATUS_USER_DOES_NOT_EXIST;
if(Users::encrypt($this->password)!==$user->password)
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else if($user->status == YumUser::STATUS_INACTIVE)
$this->errorCode=self::ERROR_STATUS_INACTIVE;
else if($user->status == YumUser::STATUS_BANNED)
$this->errorCode=self::ERROR_STATUS_BANNED;
else if($user->status == YumUser::STATUS_REMOVED)
$this->errorCode=self::ERROR_STATUS_REMOVED;
return !$this->errorCode;
}
}
class Users extends CActiveModel
{
const STATUS_INACTIVE = 0;
const STATUS_ACTIVE = 1;
const STATUS_BANNED = -1;
const STATUS_REMOVED = -2;
// some ..........
public static function encrypt($string = "")
{
$salt = 'salt';
$string = sprintf("%s%s%s", $salt, $string, $salt);
return md5($string);
}
}
Ответ 7
проверьте конфигурацию безопасности для файлов cookie и сеансов.
отключить session.use_only_cookies и session.cookie_httponly в php.ini
файл.
Ответ 8
в PHP.INI = > session.use_only_cookies = 0