如何为不同的用户类型创建基于规则的访问控制单元

时间:2017-03-27 15:05:42

标签: ruby-on-rails ruby authentication software-design

我正在尝试为我的应用程序实现基于角色的访问控制单元,但是由于我的约束,我不知道该怎么做。

我使用Devise进行登录/注册操作。我只有一个模型用户,但每个用户都有不同的user_type。我有八个具有不同身份验证级别(整数)的唯一用户类型。

这些是用户与网站互动方式的限制因素:

  1. 具有较高身份验证级别的用户可以使用较低的身份验证级别功能执行相关的用户类型,即访问其相关控制器并执行操作。

  2. 并非每个具有相同身份验证级别的用户类型都可以访问同一个控制器:user1 auth_level = 2可以访问控制器C1,但user2可以访问控制器auth_level = 2 C2可以访问控制器(s-join "," (mapcar #'number-to-string ls))。另一种说法是他们在同一级别做不同的工作。

  3. 有没有宝石来实现这样的东西?我调查CanCan它不能满足我的需求。

  4. 如果没有宝石,你建议采用什么方法/设计来实现这样的访问控制单元?

2 个答案:

答案 0 :(得分:1)

我建议你使用Route Constraints(http://guides.rubyonrails.org/routing.html#advanced-constraints)来实现控制器访问。

使用request.env["warden"].authenticate,您可以在约束类的matches?方法中为当前用户验证请求。如果您使用request.env["warden"].authenticate!,您甚至会将用户重定向到登录页面,或显示相应的错误消息(取决于您的设置)。

答案 1 :(得分:0)

因为几天前我问过这个问题,有一段时间我不知道并评估可用的宝石,适合我的目的,但我找不到任何simpleeasy-to-use和{{ 1}}足以将其导入我的应用程序;所以我接受了这场战斗并编写了我自己的名为ACU (Access Control Unit)的宝石,它满足了我在问题中的约束+它非常轻巧,易于使用且适用于任何目的。

在这个gem中,每个请求要么被传递,要么不被传递,访问规则可以覆盖rails应用程序的任何方面。以下是规则集的示例,有关详细信息,请参阅here中提供的文档。

lightweight