我试图在这个框架上构建我自己的自定义身份验证系统。我已经建立了Yii的RBAC。它运行得很好。它给了我角色。后来我编辑了代码,现在我可以获得用户id和用户名。但我想要的更复杂一点。我不喜欢RBAC的这个角色系统,因为你在代码里写了固定的角色。
我的想法是一个用户组ID的用户。在数据库中,我可以操纵每个用户组可以做什么。
例如用户登录并想要创建新主题,而身份验证RBAC使用用户组ID连接到数据库,并根据该用户组获取所有数据。然后它会创建如下内容:
$this->setState('create_new_topoic', <info from database);
$this->setState('edit_topic', <info from database);
$this->setState('view_topic'', <info from database);
然后在控制器和视图的应用中我将处处使用
if (isset(Yii::app()->user->create_new_topoic) AND (Yii::app()->user->create_new_topoic>0))
{ show 'create new topic button' }
这是正常做法吗?我感兴趣的是这将如何反应服务器和MYSQL的负载。我的应用程序超载了,或者这样的系统是否可以让服务器处理?
您想要的正是RBAC所能做的。实际上,您将ROLE
赋给user而不是GROUP。想法是:
- 创建您的操作(例如创建/更新)
- 根据您的操作创建适当的角色(例如Modifier,谁可以执行创建和更新)
- 为用户分配一个或多个合适的角色
- 无论何时何地,您都可以通过角色轻松检查用户的访问权限
用代码交谈:
$rbac=Yii::app()->CAuthManager();
-
$rbac->createOperation('create','This is a description for this operation')
-
$rbac->createRole('modifier','This is a description for this role')
-
$rbac->assign('modifier','USER_ID')
-
$rbac->checkAccess('modifier')
请不要局限于Yii提供的RBAC方法。您可以在数据库中执行所有操作,并编写自己的自定义方法。(我的意思是,当您使用rbac时,您可以自定义使用它的方式。例如,将组视为角色)
要更清楚,您可以阅读Yii的RBAC文档:
Yii的IAuthManager - RBAC
RBAC工作正常。另一种方法是1)在登录时将用户类型分配给会话变量。2)在视图中查看用户类型。用户表显然需要一个user Type列。我认为这种方法很好,而且不会使服务器过载。当然,它会增加几毫秒的时间,但如果你想让同一个视图根据角色显示不同的内容,这是必需的。
在你的UserIdentity文件(/protected/components)
public function authenticate()
{
....
$this->setState('type', $user->type); //Set's Type here
$user->save();
....
}
In Your Views/Controllers
<?php if (Yii::app()->user->type == 'Finance') : ?>
{some code}
<?php else: ?>
{other code}