我正在尝试实施我的第一个RBAC系统:
我到达这个部分:
在官方文档中,他们有一个使用用户名的示例:
$auth->assign('adminRole', 'userA');
$auth->assign('adminRole', 'userB');
但是,我确实发现,在我的情况下,ID会起作用。
$auth->assign('adminRole', '8');
$auth->assign('adminRole', '9');
为什么ID工作,而不是用户名?我认为这是因为,在某个地方,我们覆盖了getId()
的{{1}}方法。
但是,在继续遵循文档和 Yii 代码之后,我注意到UserIdentity
方法不接受assign()
的子项,它使用,{相反,{1}}界面。
然后我转到CUserIdentity
,我注意到IWebUser
方法有以下内容:
CWebUser
我一直关注这一点,最后我getId()
,现在我很困惑。
那是什么id?我认为是我的用户数据库表的主键。
但是CWebUser如何知道我的用户数据库表(称为/**
* Returns a value that uniquely represents the user.
* @return mixed the unique identifier for the user. If null, it means the user is a guest.
*/
public function getId()
{
return $this->getState('__id');
}
)btw。
我唯一的配置确实与用户有关,授权就是这个,在我的主配置文件中:
$_SESSION[$key]
Yii在tbl_site_user
第二个参数上获得了ID?
答案 0 :(得分:1)
在您的代码中的某个时刻,您可以使用Yii::app()->user->login($identity);
来调用CWebUser::login()。
public function login($identity,$duration=0)
{
$id=$identity->getId();
$states=$identity->getPersistentStates();
if($this->beforeLogin($id,$states,false))
{
$this->changeIdentity($id,$identity->getName(),$states);
...
此方法接受您的CUserIdentity对象,从中提取ID,然后调用CWebUser::changeIdentity()。
protected function changeIdentity($id,$name,$states)
{
Yii::app()->getSession()->regenerateID(true);
$this->setId($id);
$this->setName($name);
$this->loadIdentityStates($states);
}
调用CWebUser::setId()的地方。
public function setId($value)
{
$this->setState('__id',$value);
}
设置__id
会话状态。