我正在尝试在此框架上构建自己的自定义身份验证系统。 我已经建立了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的负载做出反应感兴趣。我正在重载我的应用程序或这样的系统可以让服务器处理?
答案 0 :(得分:1)
你想要的是RBAC究竟能做什么。实际上,您向用户而不是GROUP提供ROLE
。想法是:
在代码中说话:
$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文档:
答案 1 :(得分:1)
RBAC工作正常。另一种方法是1)在登录时将用户类型分配给会话变量。 2)在视图中检查用户类型。用户表显然需要User Type列。我认为这种方法很好,它不会使服务器过载。当然它会增加几毫秒,但如果你想让相同的视图根据角色显示不同的东西,它是必需的。
在您的UserIdentity文件(/ protected / components)
中public function authenticate()
{
....
$this->setState('type', $user->type); //Set's Type here
$user->save();
....
}
在您的视图/控制器中
<?php if (Yii::app()->user->type == 'Finance') : ?>
{some code}
<?php else: ?>
{other code}