Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-设计帮助:具有不同用户权限级别的应用程序_Ruby On Rails_Privileges - Fatal编程技术网

Ruby on rails Rails-设计帮助:具有不同用户权限级别的应用程序

Ruby on rails Rails-设计帮助:具有不同用户权限级别的应用程序,ruby-on-rails,privileges,Ruby On Rails,Privileges,这是我关于stackoverflow的第一个问题,它非常通用,希望我能在这里得到建议 我很快制作了一个Rails3纯管理应用程序,主要用于有关加热设备维护的数据输入任务。它由大约10个模型组成,我广泛使用脚手架和资源嵌套来构建一个完整的特权用户(admin)应用程序。主要有一个系统模型,有很多子模型,每个系统属于一个操作员 现在,我需要每个操作员登录并管理自己的系统,这几乎完全是管理员用户可以做到的,但将权限限制在属于该操作员的系统上 现在的问题是。。。我应该: (1)过滤模型脚手架生成控制器中

这是我关于stackoverflow的第一个问题,它非常通用,希望我能在这里得到建议

我很快制作了一个Rails3纯管理应用程序,主要用于有关加热设备维护的数据输入任务。它由大约10个模型组成,我广泛使用脚手架和资源嵌套来构建一个完整的特权用户(admin)应用程序。主要有一个系统模型,有很多子模型,每个系统属于一个操作员

现在,我需要每个操作员登录并管理自己的系统,这几乎完全是管理员用户可以做到的,但将权限限制在属于该操作员的系统上

现在的问题是。。。我应该:

(1)过滤模型脚手架生成控制器中的数据?

例如(不关心语法,只是给出想法):

(2)为限制权限的操作员编写不同的控制器?

将脚手架生成的结构替换为一个用于管理员控制器的文件夹(例如System.all语句),另一个用于操作员控制器的文件夹(例如@operator.systems语句)

(3)在单独的应用程序中拆分?

保存脚手架生成的结构?你在说不!不不对吧?

(4)希望从stackoverflow专家用户那里得到更好的建议?


谢谢大家…

从性能角度来看,按运算符筛选行(如1所示)是最好的

出于安全原因,您还应该在筛选控制器之前进行签入,以便操作员1无法查看其他操作员数据。例如,如果系统1属于操作员1,则需要确保操作员2无法键入浏览器系统/1并查看数据(假设系统/1为:controller=>:system,:action=>:show,:id=>1)


如果性能不是一个大问题,您可以看看,它允许基于角色的对象实例授权,并使用很酷的语法检查权限:)

谢谢您,Adrian,当然会有一个before_过滤器,通过输入用户和密码来验证操作员。然后,所有数据都将通过仅通过operator对象获取数据进行过滤,请查看上面的:@systems=@operator.find(session[:operator_id]).systems。是的,你是对的,甚至其他动作也必须有类似的过滤器。也许一个甚至带有重定向的before_过滤器应该很好。我关心的是代码的可维护性,而不是性能。第一个想法仍然是最好的吗?当然我会看看你提到的插件。
def index
  if session[:operator_id]
    @operator = operators.find(session[:operator_id])
    @systems = @operator.systems
  else if session[:admin] == true
    @systems = System.all
  end
end