如何实施授权?

时间:2016-01-21 21:39:41

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 authorization

假设我有一个名为Animal的模型。此模型包含具有两种可能状态的枚举属性。

class Animal < ActiveRecord::Base
  enum kind: [ :cat, :dog ]
end

然后在我的控制器中创建不同的实例变量。

class AnimalsController < ApplicationController
  def index
    @cats = Animal.cat
    @dogs = Animal.dog
  end
end

在我看来,我有两个独立的收藏。

<h1>Animals</h1>

<%= render partial: 'animals/cat', collection: @cats, as: :cat %>
<%= render partial: 'animals/dog', collection: @dogs, as: :dog %>

如何授权能够编辑第一个集合的资源而不能编辑第二个集合的资源?

以下方法无法正常工作,因为它仅适用于一个操作。

before_action :current_user_only, except: [:edit]

那么,我该如何实施这种授权?

提前致谢!

1 个答案:

答案 0 :(得分:1)

授权 - 以任何身份 - 通常用两种模式表示:

  • plot(all_data[,2], all_data[,3], ylim = c(0, 20), xlim = c(0,20), xlab = "Input", ylab = "Output", xaxt='n', yaxt='n') text(all_data[,2], all_data[,3], labels = all_data[,1], cex = 0.7, pos = 4) abline(lm(y~x, data=all_data, subset=X %in% c("DMU 1","DMU 6") )) arrows(x0=5, y0=15, x1 = 10, y1 = 10, length = 0.10, angle = 20, code = 2, col = par("fg"), lty = par("lty"), lwd = par("lwd")) text(6, 15.5, "Efficient Frontier", cex = .8) 基于
  • record/object基于

您似乎需要基于role/user的授权;因此,如果对象符合某些标准,则用户可以编辑该对象。

在Rails中执行此操作的最有效方法是使用名为Pundit的gem,但我更喜欢CanCanCan(原CanCan):

record/object

然后您可以在前端验证:

#Gemfile 
gem "pundit"

#app/policies/animal.rb
class AnimalPolicy
  attr_reader :user, :animal

  def initialize(user, animal)
    @user   = user
    @animal = animal
  end

  def edit?
    animal.cat?
  end

  def update?
    animal.cat?
  end
end

#app/controllers/animals_controller.rb
class AnimalsController < ApplicationController
   def edit
      @animal = Animal.find params[:id]
      authorize @animal
   end

   def update
      @animal = Animal.find params[:id]
      authorize @animal
   end
end

-

这使您能够允许用户执行您认为合适的任何操作。

<强>更新

由于您希望评估用户和对象,因此您非常幸运,默认情况下<% if policy(animal).update? %> <%= link_to "Edit", animal %> <% end %> Pundit都支持CanCanCan

users

最重要的一点是,授权是一种布尔模式 - #app/policies/animal.rb class AnimalPolicy attr_reader :user, :animal def initialize(user, animal) @user = user @animal = animal end def edit? user.moderator? && animal.cat? end def update? user.moderator? && animal.cat? end end 。这意味着您只需在授权系统中提供条件逻辑(如上所述),即可返回unless true deny accesstrue