3

我一直在摆弄 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)

谢谢!

4

1 回答 1

6

我认为你应该使用强参数。此 gem 允许您选择要更新的参数。如果您使用的是 Rails 4,则 gem 已经安装,否则您可以安装它

class UsersController < ApplicationController
  load_and_authorize_resource

  def update
    if @user.update_attributes(update_params)
      # hurray
    else
      render :edit
    end
  end

  private

  def update_params
    if current_user.admin?
      params.require(:user).permit(:user, :email, :password, :admin)
    else
      params.require(:user).permit(:user, :email, :password)
    end
  end
end
于 2015-08-08T13:09:26.577 回答