我一直在摆弄 CanCanCan gem 来限制普通用户的操作,但到目前为止,我只设法限制对整个模型的授权,而我真正需要的是限制对其某些属性的访问。
例如,在我的用户模型上,除了用户/密码/电子邮件的东西,我还有一个布尔值用于管理员,我用它来验证登录用户的状态,在这种情况下,如果 user.admin?,它可以访问/管理一切,否则,它应该能够读取所有内容,并且只有在 user.id 匹配时才能更新自己的记录。
我已经阅读了很多次文档,最接近的是将它添加到 app/models/ability.rb
can :update, :users, [:name, :password, :email]
这没有任何作用。
所以,
问题:用户可以 :update 整个模型,或者只是 :read 它,我不能将它设置为 :update 或 :read 特定属性。
我需要什么:用户能够 :edit 仅特定属性。
问题:限制属性的正确语法是什么?我必须在其他一些文件上设置任何其他配置吗?
我的 Ability.rb 文件:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, :all
can :import, [User, Enclosure, Blade, Component]
else
can :access, :rails_admin
can :dashboard
can :read, :all
can :history, :all
# Allows user to only edit an enclosure, if it's allocated to itself, or not allocated at all
can :update, Enclosure do |enclosure|
can :update, Enclosure if (enclosure.allocated_to == user.email && enclosure.allocation == true) || enclosure.allocation == false
end
end
end
end
我正在使用的宝石(除了默认的 Rails 4 宝石):
# Administration Panel Gems
gem 'rails_admin' # Rails Administration Panel Gem
gem 'rails_admin_history_rollback' # Enables users to visualize and revert history
gem 'rails_admin_import', "~> 1.0.0" # Enables importing
gem 'devise' # Authentication Gem
gem 'cancancan' # Authorization Gem
gem 'paper_trail', '~> 4.0.0.rc' # Auditing Gem (History)
谢谢!