假设我有一个名为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]
那么,我该如何实施这种授权?
提前致谢!
答案 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 access
或true
。