我正在为我的应用程序构建一个身份验证模块,我不太了解CWebUser
和CUserIdentity
之间的关系。
要将用户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
类的方法?这里的分工是什么?
答案 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建议的如此复杂的类层次结构呢?我从来不理解它。