- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Rails 应用程序有许多形成层次结构的模型。例如:零售商 > 部门 > 产品类别 > 产品 > 评论。
业务需求是高权限用户可以与新的或现有的“普通”用户“共享”层次结构中的任何单个元素。如果没有与他们共享对象,普通用户就无权查看(或执行任何其他操作)层次结构中任何级别的任何对象。
共享过程包括选择共享是否授予对目标对象的只读、读取更新或完整 CRUD 的权限。
共享任何对象都会授予该对象和层次结构中所有较低级别对象的 R/O、R/W 或 CRUD 权限,以及该对象的所有直接祖先的 R/O 权限。对象集合有机地增长,因此权限系统仅通过记录 user_id、共享的 object_id 和共享的性质(R/O、CRUD 等)来工作。由于此层次结构中的对象数量一直在增长,因此在 DB 中为每个用户/对象组合创建明确的权限记录是不切实际的。
相反,在用户请求周期开始时,ApplicationController
收集所有权限记录(用户 X 对部门 #5 具有 CRUD 权限)并将它们保存在内存中的哈希中。权限模型知道当任何对象传递给它时如何评估散列 - Permission.allow?(:show, Department#5) 将根据用户的权限散列的内容返回 true 或 false。
让我们以部门模型为例:
# app/models/department.rb
class Department < ActiveRecord::Base
after_initialize :check_permission
private
def check_permission
# some code that returns true or false
end
end
check_permission
方法返回 true,我想要
Department.first
正常恢复数据库中的第一条记录,但是,如果
check_permission
返回false,我要返回
nil
.
after_initialize
预先授权对象的回调。
after_initialize
无法阻止返回原始对象。它确实允许我重置对象属性的值,但不能免除它。
最佳答案
基本上,您需要在返回数据库查询结果之前检查访问权限(或权限)。您正在尝试将此逻辑集成到您的模型中。
这是可能的,但不是您在问题中描述的设计。在 ActiveRecord 适配器方法(例如 first
、 all
、 last
等...)中直接实现这一点并不干净。你需要重新考虑你的设计。
(如果阅读太多,请跳到点“D”)
您有多种选择,这都取决于您定义权限的方式。我们来看几个案例:
A. 用户拥有他拥有的部门列表,只有他可以访问它们
您可以简单地将其实现为 has_many
/belongs_to
与 Active Record Associations 的关联
B. 用户和部门是独立的(换句话说:没有前面案例中描述的所有权),并且可以为每个用户和每个部门单独设置权限。
再次简单,你可以实现一个 has_and_belongs_to_many
与 Active Record Associations 的关联.您将需要创建 Web 逻辑,以便您的应用程序管理员可以添加/编辑/删除访问权限。
C. 更复杂的情况:现有的授权库
大多数人会转向授权解决方案,例如cancan , pundit或 other
D. 当这些授权库超出您的需求时(实际上,在我的大多数项目中都是我的情况),我发现通过 rails scoping 实现授权满足我的所有需求。
让我们通过一个简单的例子来看看。我希望管理员能够访问整个数据库记录;普通用户只能在营业时间(例如上午 8 点至下午 6 点)访问 status = open 的部门。我写了一个实现我的权限逻辑的范围
# Class definition
class Department
scope :accessible_by -> (user) do
# admin user have all access, always
if user.is_admin?
all
# Regular user can access only 'open' departments, and only
# if their request is done between 8am and 6pm
elsif Time.now.hour >= 8 and Time.now.hour <= 18
where status: 'open'
# Fallback to return ActiveRecord empty result set
else
none
end
end
end
# Fetching without association
Department.accessible_by(current_user)
# Fetching through association
Building.find(5).departments.accessible_by(current_user)
Department.all
而不是
Department.accessible_by(current_user)
)。因此,这就是为什么您必须在规范中(在 Controller 或功能级别)切实测试您的权限。
nil
当权限失败时(如您在问题中提到的),而是一个空的结果集。它通常会更好,因此您可以保留 ActiveRecord 方法链接功能。但是您也可以引发异常并将其从您的 Controller 中拯救出来,然后重定向到“未授权”页面。
关于ruby-on-rails - 如果 after_initialize 回调返回 false,则返回 nil 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077572/
class test { public static void main(String[] args){ Object o1 = new Object(); O
我以为我理解了 Python 中的这两个单例值,直到我看到有人在代码中使用 return l1 or l2,其中 l1 和 l2 都是链表对象,并且(s)他想如果不为 None 则返回 l1,否则返回
这个问题在这里已经有了答案: Why does the expression 0 >> (True == False) is False True >>> True == (False is Fals
为什么在 Python 中它是这样评估的: >>> False is False is False True 但是当用括号尝试时表现如预期: >>> (False is False) is False
我有一个名为“apple”的表,我编写了以下查询: select name, count(name), case when istasty is null then fal
python boolean 逻辑中的运算符优先级 print(False==True or False) #answer is True print(False==(False or True))#
请不要看条件,因为它们在这里是为了便于理解行为 为什么 result 等于 true ? boolean result = false && (false)?false:true; 我知道我们可以通过
乍一看,这篇文章可能看起来像是重复的,但事实并非如此。相信我,我已经查看了所有 Stack Overflow,但都无济于事。 无论如何,我从 Html.CheckBoxFor 得到了一些奇怪的行为。
这个问题在这里已经有了答案: python operator precedence of in and comparison (4 个答案) 关闭 6 年前。 我的一位前辈演示了它,我想知道这是否是
我最近参加了 Java 的入门测试,这个问题让我很困惑。完整的问题是: boolean b1 = true; boolean b2 = false; if (b2 != b1 != b2) S
为什么 {} == false 评估为 false 而 [] == false 评估为 true在 javascript 中? 最佳答案 这是根据 Abstract Equality Comparis
这个问题在这里已经有了答案: Why does (1 in [1,0] == True) evaluate to False? (1 个回答) 关闭7年前。 为什么使用括号时这些语句按预期工作: >>
我试过搜索这个,但我真的不知道如何表达它以查看是否有其他人发布了答案。 但是,我正在制作一个国际象棋游戏和一个人工智能来配合它,这是非常困难的,我的问题是当我检查两个棋子是否在同一个团队时我必须做 (
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
为什么 为 false || null 返回与 null || 不同的结果错误? 我可以安全地依赖 return myVar || false 如果 myVar 为 null 或 false,则返回
我正在尝试遵循 NHibernate 教程,“你的第一个基于 NHibernate 的应用程序:修订 #4”在 NHibernate Forge。 但线路:new SchemaExport(cfg).
这个问题在这里已经有了答案: Empty list boolean value (3 个答案) 关闭 4 年前。 我是 Python 的新手,不理解以下行为: 为什么要声明 [] == False
以下函数循环访问对象的值。如果值为空this.hasInvalidValue设置为true ,如果不为空 this.hasInvalidValue设置为false : user: { email:
所以我正在玩 java.lang.reflect 东西并尝试制作类似 this 的东西。这是我的问题(可能是一个错误): 将字段设置为 true 的方法的代码: private static void
当我在编程时,我的 if 语句出现了意想不到的结果。 这个代码警报怎么会是真的?我在 W3S 没有找到任何可以帮助我的东西,我真的很想知道为什么这些警报是“正确的” window.alert(fals
我是一名优秀的程序员,十分优秀!