0

目前,在我的应用程序中,访问者只能拥有 3 个角色:

  • admin拥有所有特权
  • user可以在系统内执行多项关于他/她自己的动作
  • guest可以观看和发送错误报告

一切都是原始实现的,如下所示:在数据库中,每个用户都有一个字段,其中指示了他的存在admin(代表2该字段)或user1),并且在application_controller.rb其中仅检查if logged_in? && current_user.DB_FIELD == 2(或> 0),并且在必要的控制器中发生支票before_filter

然而,直到最近,当我们决定扩展系统的功能时,这样一个简单的实现仍然很有效,也就是说,部分是允许管理员将用户加入到组中,但也有一些时候。为了更好地理解我要问的问题,让我从我看到的方式描述情况(也许你可以提出更好和合乎逻辑的建议):

  1. 我是管理员。我打开/groups,然后查看组列表。
    • 什么是组?一方面,组是一组权限,另一方面,是在我的应用程序中应该具有相同权限的用户的组合。
    • 什么是许可?权限是分配给它的组的每个用户都可以执行的一项操作。
  2. 我想将新用户合并到一个组中,但该组不存在。所以我单击按钮(代表/groups/new),然后弹出创建组窗口。在那里,我有一个用于组名的文本字段、大量复选框,每个复选框代表一个权限、一个用于添加用户的字段和一个保存按钮。我写了组名,检查我要分配给这个组的所有权限,将用户添加到这个组(我将通过ajax搜索来实现这个:开始输入用户名,他/她出现,单击Enter,然后一个添加用户,然后在需要时重复这些操作 - 这是一种好的方法吗?),然后单击保存。
  3. 好的,我有一个有几个用户的新组。但是停下来,我意识到我忘了再添加一个人!我返回编辑组窗口 ( /groups/edit),并重新填写错误填写的字段。单击“保存” - 又是一些魔法(我的意思是,通过数据库更新操作)。

那么,我在最后阶段有什么?我可以自由地 c/r/u/d 组,管理其中的用户和权限,并以非常 GUI 驱动的方式执行它(我的意思是,复选框、ajax 搜索字段等)

两周以来,我一直在谷歌搜索/stackoverflowing/审查有关基于 rails 角色和基于组的授权的信息;已经找到了很多解决方案,如 cancan、easy_rolestroles等 gem,但在其中任何一个中都找不到如何实现基于组的方法,这是动态的(或可定制的?或动态可定制的?)。唯一真正 100% 满足我需求的是redmine权限和权限组方法,但由于其超过 9000 个功能,它过于复杂,所以我什至无法完全理解它是如何实现的,更不用说我自己实现了.

问题是(假设权限集是永久的,因此可以硬编码,并且组集是绝对免费的;此外,如果用户不属于任何组,他/她具有默认用户权限;此外,权限不仅适用于 c/r/u/d 操作,还适用于手动创建的方法):

  1. 实施上述系统的最佳方法是什么?我没有找到任何现有的宝石或方法?
  2. 如何轻松地为可扩展性存储权限和权限组?位掩码或单独的权限、权限组分配和组表?
  3. 如何轻松地将用户分组?用户数据库行中的组字段,还是单独的用户到组分配表?

优选地,分配给用户被添加到的组的权限立即应用于他,而无需任何用户重新登录。

提前谢谢你!

4

1 回答 1

0

经过几个晚上,我终于找到了一个解决方案,在我看来,它相当简单但功能强大,但显然不是最好的(但仍然是一个)实现。

所以,我们现在有 +1 表,它是组的,其中列是idnamepermission。最后一列是一个通常的整数,它以十进制数表示所有权限。

权限在控制器中是“别名”的:例如1代表can_manage_smth2代表can_view_smth等。

权限选择面板位于 /groups 部分,是一组简单的复选框,onchange对每个我们使用存储在表中的权限执行OR操作(例如,我们选择 3 个复选框代表1816, 然后我们进入我们的表25, 这又是1 | 8 | 16) 的结果。

所以回答我的问题:

  1. 不是最好的,但仍然是一个解决方案。
  2. 它几乎不会影响可伸缩性,因为添加新权限(这是一种非常罕见的操作)只会要求权限的新别名及其在控制器开头的 before_filter 检查。而且我使用了位掩码,但不是二进制,而是一个通常的十进制值,简单的二进制逻辑操作数可以使用它。
  3. 没有单独的用户到组分配表,只有表中的一个group_iduser(已经存在)。

希望实施的一切都能完美运行。如果出现任何问题,我会在这里指出。此外,如果有任何新的实施想法出现。

不管怎样,谢谢大家!

于 2014-03-27T14:38:38.133 回答