Session 在Yii中使用会话、Cookies时的真正困境

Session 在Yii中使用会话、Cookies时的真正困境,session,cookies,yii,setstate,Session,Cookies,Yii,Setstate,我在WebUser中为我的属性/方法设置了如下会话 public function getRole(){ $user = $this->loadUser(Yii::app()->user->id); $this->setState('roleId', $user->roles_id); return $user->roles_id; } 在配置中,我已将autostart会话设置为“true”,将cookieMode设置为“only”。我知道,当我“设置状态

我在WebUser中为我的属性/方法设置了如下会话

public function getRole(){
$user = $this->loadUser(Yii::app()->user->id);
$this->setState('roleId', $user->roles_id);
return $user->roles_id;
}
在配置中,我已将autostart会话设置为“true”,将cookieMode设置为“only”。我知道,当我“设置状态”时,也会创建具有相同名称的cookie以及会话变量。目前我正在使用Yii::app->user->roleId调用这些变量

我的问题是: a要利用cookies和/或已设置的会话变量,我是否应该使用Yii::app->request->cookies['roleId']调用它们;或者Yii::app->session['roleId']

如果已经设置为Cookie或Session而不是再次运行整个方法,那么调用Yii::app->user->roleId会给我这个值吗


我感谢你的支持

我只会为此使用会话。Cookie很容易被篡改,用户可能会为自己分配另一个角色id。会话比较安全


使用您的WebUsers getRole,它会像上面一样在会话中缓存它。这很好。只要在顶部打个勾,如果有会话var roleId,立即返回它。如果没有,请加载用户并将其像您已经加载的那样放到那里。

谢谢,这似乎是一个很好的解决方案。但我已经允许吃饼干了。你认为我应该全部禁用cookies吗?。当我同时使用会话和cookie,而有人篡改了cookie时会发生什么?。那么我应该在哪里使用饼干呢?不,一点也不。我只是不想把关键变量保存在cookie中。打开cookies很好,当然你至少需要打开它来存储会话ID,否则你的会话将无法工作。这就是我所做的。请检查:公共函数getRoleId{if$this->hasStateroleId{return$this->getStateroleId;}$user=$this->loadUserYii::app->user->id;$this->setState'roleId',$user->roles\u id;return$user->roles\u id;}您认为我应该检查cookie之前是否也设置过,或者就是这样。谢谢你的耐心……没有必要检查饼干。如果没有cookie,就不会有会话,因此hasState将为false。