访问控制实现

时间:2011-06-27 12:07:22

标签: ruby

我为我的ROR应用实施ACL。我有access变量存储用户权限 它包含每个用户具有数组值的哈希值 第一个数组元素是控制器名称和第二个元素 - 带有操作名称的数组。

access = {
           'user' => [
             ['drivers', ['show','delete','update']],
             ['index',   ['edit','destroy','view']]
           ],

           'administrator' => [
             ['users', ['show','edit','delete']],
             ['index', ['delete','index','show']]
           ]
         }

我想检查用户是否有权访问特定的控制器和操作

user       = 'administrator'
controller = 'index'
action     = 'delete'

我是用

做的
if access[user]
  access[user].each do |acc|
    if acc[0].include? controller 
      if acc[1].include? action
        puts "User '#{user}' have access to controller '#{controller}' and action '#{action}'"
      end
    end
  end
end

也许存在更优雅的方式来存储类似的数据或更好的方式来访问它?

2 个答案:

答案 0 :(得分:1)

这是一种更优雅的方式:https://github.com/ezmobius/acl_system2

答案 1 :(得分:1)

我建议使用像CanCanStonewall这样的系统,而不是自己滚动。

这两种方法都允许您询问“此用户可以在此对象上执行此操作吗?”。

Stonewall + StonewallActionProtection,我自己的插件,可以自动检查CRUD操作。