CWebUser和CUserIdentity

时间:2013-01-31 04:34:47

标签: yii

我正在为我的应用程序构建一个身份验证模块,我不太了解CWebUserCUserIdentity之间的关系。

要将用户ID设置为Yii::app()->user->id,我必须在UserIdentity课程中执行此操作并创建方法:

public function getId() {
    return $this->_id;
}

但要将isAdmin设置为Yii::app()->user->isAdmin,我必须在WebUser课程中创建一个方法:

function getIsAdmin() {
    $user = $this->loadUser(Yii::app()->user->id);
    return intval($user->user_level_id) == AccountModule::USER_LEVEL_ADMIN;
}

为什么我不能只创建UserIdentity类的方法?这里的分工是什么?

3 个答案:

答案 0 :(得分:5)

UserIdentity(UI)类就像一张身份证,其中WebUser类是真人,加上你对它们的了解。

UI类通过数据库,webservices,textfile等提供身份验证。它可以让您知道关键属性是什么,并允许您操作它们。但是,用户可以为您提供有关他们允许执行的操作的更多信息,名称,细化权限等。

好的,结束隐喻

UI类包含密钥信息,因此在询问用户ID时,它将引用User Identity 类来获取用户的 Identifier

与识别或验证用户无关的任何内容都在WebUser

完全清除它?

你的例子

您以getId函数为例,但可以在WebUser上创建,以覆盖默认值,即从状态拉出。

所以不确定你的意思。

答案 1 :(得分:2)

我喜欢接受的答案如何使用现实生活中的例子来使其更容易理解。但是,我也喜欢克里斯用例子解释它here

  

用户信息存储在CWebUser类的实例中   这是在应用程序初始化时创建的(即:用户优先时   无论用户是否已登录,都与网站连接)   在或不。默认情况下,用户设置为“Guest”。身份验证是   由一个名为CUserIdentity的类管理,这个类检查了   用户是已知的并且是有效用户。此验证的发生方式取决于   在您的应用程序上,可能是对数据库,或登录   facebook,或者针对ldap服务器等...

答案 2 :(得分:2)

使用所有这些课程有什么好处?我可以通过用户模型做所有事情。如果我设置方案“login”,将在验证期间检查密码。如果验证没问题,我可以像这样设置会话我自己的变量:

$model = new User("login");
$model->attributes = $_POST["User"];
if ($model->validate())
{
  Yii::app()->session["currentUser"] = $model;
}
else
{
  // .. show error
  unset(Yii::app()->session["currentUser"]);
}

在用户模型中,我有静态方法来检查这个变量

public static function isGuest()
{
  return isset(Yii::app()->session["currentUser"]);
}

public static function getCurrent()
{
  return Yii::app()->session["currentUser"];
}

我可以很快打电话:

User::isGuest();
$model = User::getCurrent();
// instead of writing this:
Yii::app()->user->isGuest;

那么我为什么要使用Yii建议的如此复杂的类层次结构呢?我从来不理解它。