3

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

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

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

但是要设置isAdminYii::app()->user->isAdmin我必须在我的WebUser类中创建一个方法:

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

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

4

3 回答 3

5

( UserIdentityUI) 类就像一张身份证,其中WebUser类是真实的人加上你所知道的关于他们的一切。

UI 类通过数据库、Web 服务、文本文件等为您提供身份验证。它让您知道关键属性是什么,并允许您操作它们。但是,用户可以为您提供有关他们被允许做什么、名称、细粒度权限等的更多信息。

OK,结束比喻

UI 类保存关键信息,因此在询问用户 ID 时,它将参考 User Identity类来获取用户的Identifier

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

彻底清除?

你的例子

您以getId函数为例,但可以创建该函数WebUser以覆盖默认值,即从状态中提取。

所以不确定你在这里的意思。

于 2013-01-31T09:07:42.483 回答
2

我喜欢接受的答案如何使用现实生活中的例子来使其更容易理解。但是,我也喜欢 Chris 在这里举例说明的方式。

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

于 2014-01-23T13:30:44.297 回答
2

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

$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 建议的如此复杂的类层次结构呢?我一直不明白。

于 2014-03-16T09:06:55.510 回答