認証したユーザーと認証していないユーザーの間にいくつかの違いを作り始めました。このために、私は使用しています
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);
}?>
そして、ログイン(成功)したかどうかに関係なく、常に「おかえりなさい!」というメッセージが表示されます。そして私が 持ってる ログインすると、ウェルカムメッセージとユーザー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
)
どんな助けでも大歓迎です!
たぶん、もっと難しいデバッグを試みることができます:メッセージを次のようなものに変更してください:
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,
),
...
エラーは次の行にあります
$this->setState('id', $user[0]->id);
official yii auth&authに関するドキュメント に見られるように、setState
は何にでも使用する必要がありますbutidフィールド。キーを実装するためにYiiはユーザーを識別するために使用し、Identity getId()
でユーザーごとに一意の値を返します。関数。
あなたの場合、これは単に上記の行を次のように変更する必要があることを意味します。
$this->_id = $user[0]->id;
ログインプロシージャの実際の内部動作については、CWebUser
クラス、特にIDの実際の格納を担当する ログイン関数 を確認することをお勧めします。 getId()
戻り値。
認証関数loginuserを呼び出すとき
$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();
このコードを適用して確認してください
私は同じ問題に直面し、UserIdentityコンポーネントの1行だけでこの問題を解決できることがわかりました。
これはあなたのコードです:
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;
}
次のコードを試してください。そのうまく機能
//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);
}
}
まず、ゲストとログインユーザーを区別する条件を知る必要があります。
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
...
}
}
つまり、Identity永続状態に「id」を指定しましたが、Yii CWebUserはUserIdentity :: getId()に基づいて「__id」を期待しています。
解決策は非常に単純です。 $ 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's ID that'll be fetch by CWebUser
...
}
}
このルーチンでは、CWebUserがUserIdentityのIDを取得する方法について説明します。 https://github.com/yiisoft/yii/blob/master/framework/web/auth/CWebUser.php#L221
テストしてみてください。
pHP.INIの場合=> session.use_only_cookies = 0
cookieとセッションのセキュリティ構成を確認してください。 php.iniファイルのsession.use_only_cookies&session.cookie_httponlyを無効にします。