请教一个关于yii用户验证的问题,谢谢 [ 未指定版本 ]
首先很抱歉,对不起,我实在没有钱作悬赏,但是还是希望大神们能够帮帮我,谢谢
最近学yii2遇到一点困惑,yii2里有一个IdentityInterface接口,实现了该接口的user类可以通过$app->user获取到用户登录状态,我看basic模板的源码在验证用户登录成功后有一个gohome和goback方法重定向了一下,我不太看得懂这里的额源码,所以直接redirect了,发现重定向后无法获取$app->user登陆状态了,此时为空,请问如何在重定向后能获取到该user属性该如何实现呢?
以下附上我的实现代码截图,希望有人能帮帮我
下面是一个users model,继承了IdentityInterface接口, 里面有login验证方法
class Users extends \yii\db\ActiveRecord implements IdentityInterface
{
public $rememberMe = false;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'users';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['username', 'email', 'password', 'create_at', 'status'], 'required'],
[['create_at'], 'safe'],
[['status'], 'integer'],
[['username'], 'string', 'max' => 20],
[['email'], 'string', 'max' => 40],
[['password'], 'string', 'max' => 64],
[['auto_key', 'access_token'], 'string', 'max' => 30],
[['username', 'email'], 'unique', 'targetAttribute' => ['username', 'email'], 'message' => 'The combination of Username and Email has already been taken.']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'username' => 'Username',
'email' => 'Email',
'password' => 'Password',
'create_at' => 'Create At',
'status' => 'Status',
'auto_key' => 'Auto Key',
'access_token' => 'Access Token',
];
}
public function scenarios()
{
return [
'login'=>[ 'username', 'password'],
'register'=>['username', 'password','email']
];
}
public function login()
{
if( !$this->validate() )
return false;
$user = Users::findOne( [ 'username'=>$this->username ] );
if( $user==null )
{
return false;
}
if( $user->password != $this->password )
{
return false;
}
return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
}
public function register()
{
return true;
}
/**
* Finds an identity by the given ID.
*
* @param string|integer $id the ID to be looked for
* @return IdentityInterface|null the identity object that matches the given ID.
*/
public static function findIdentity($id)
{
return static::findOne(['id'=>$id]);
}
/**
* Finds an identity by the given token.
*
* @param string $token the token to be looked for
* @return IdentityInterface|null the identity object that matches the given token.
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
/**
* @return int|string current user ID
*/
public function getId()
{
return $this->id;
}
/**
* @return string current user auth key
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @param string $authKey
* @return boolean if auth key is valid for current user
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
然后再action里实现的代码如下
class DefaultController extends Controller
{
public $layout = 'basic';
public function actionIndex()
{
if( !Yii::$app->user->isGuest )
{
return Yii::$app->getResponse()->redirect('?r=user/main/index');
}
else {
$model = new Users();
$model->setScenario('login');
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->redirect(['/user/main/index']);
}
else{
return $this->render('login', ['model' => $model]);
}
}
}
}
问题是,在验证通过重定向之后无法获取$app->user的属性,请问如何操作才正确呢?谢谢
共 1 个回答
-
首先,验证用户登录成功后的
goback
方法重定向对于你的问题是没有任何影响的,你也不用管它。(其实代码不复杂,和redirect
基本相同)。我看了你的代码,没有发现问题,下面我建议你来检查一下:
你试着登录成功之后让页面跳转redirect
到主页,比如你的主页是/site/index
,你在render
之前写这样一句:if (\Yii::$app->user->isGuest==true) { echo "true"; } else { echo "false"; }
看看能否输出
false
,如果没有说明没有登录成功。这和以下方法相似:
注意看你的login菜单是否变成了logout
(因为登录成功login
菜单要变成logout
原因如下views\layouts\main.php
)Yii::$app->user->isGuest ? ['label' => 'Login', 'url' => ['/site/login']] : ['label' => 'Logout (' . Yii::$app->user->identity->username . ')', 'url' => ['/site/logout'], 'linkOptions' => ['data-method' => 'post']],
如果真的变成了
logout
,说明Yii::$app->user->isGuest
变成了false
,也就是\Yii::$app->user
可以调用了,主页一定会有输出false
才对。
如果没有变成logout
,主页也没有输出,说明登录并没有成功。共 2 条回复
小黑豆
最后登录:2015-10-07
在线时长:8小时1分
- 粉丝2
- 金钱15
- 威望0
- 积分95