我基于用户组而不是角色对系统进行身份验证


yii authenticate system based on usergroups instead of roles

我试图在这个框架上构建我自己的自定义身份验证系统。我已经建立了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。想法是:

  1. 创建您的操作(例如创建/更新)
  2. 根据您的操作创建适当的角色(例如Modifier,谁可以执行创建和更新)
  3. 为用户分配一个或多个合适的角色
  4. 无论何时何地,您都可以通过角色轻松检查用户的访问权限

用代码交谈:

$rbac=Yii::app()->CAuthManager();
  1. $rbac->createOperation('create','This is a description for this operation')
  2. $rbac->createRole('modifier','This is a description for this role')
  3. $rbac->assign('modifier','USER_ID')
  4. $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}