访问控制实现



我为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

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

与其自己滚动,我建议使用CanCan或Stonewall这样的系统。

这两种方法都允许你问"这个用户能在这个对象上做这件事吗?"。

Stonewall+StonewallActionProtection,我自己的一个插件,可以自动对CRUD操作进行访问检查。

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

最新更新