我一直在尝试在ActiveRecord之上实现授权层。让我解释一下它应该如何运作。
考虑具有以下字段的数据库表Invoices
将有一个带有字段
的辅助表InvoicePrivileges
为了能够阅读发票,尝试read
行或行集的实体必须在InvoicePrivileges
表中有一组条目(其中InvoicePrivileges.object_id
指的是InvoiceId
与InvoicePrivileges.read = true
。{/ p>
示例,用于从数据库中获取大量发票的查询
SELECT invoice.*
FROM Invoices invoice
LEFT JOIN InvoicePrivileges privilege
ON invoice.invoice_id = privilege.object_id
AND privilege.subject_id = <user_id>
AND privilege.subject_type = <user_type>
WHERE privilege.read = TRUE;
尝试update
发票时,相同的条件适用,但上一个WHERE
条件变为WHERE privilege.write = true
。
我可以使用Arel library轻松创建这些约束。但是,我在哪里以所有ActiveRecord保存和更新操作都包含这些约束的方式实现这些方法?
我不介意编写一些代码来启用它。我正在寻找关于如何最好地解决它的指针。
答案 0 :(得分:0)
创建一个gem并在ActiveRecord gem之后需要它。在你的gem中打开ActiveRecord类并覆盖感兴趣的方法。
module ActiveRecord
class Base
def save(*)
if(authorised?)
super
else
raise NotAuthorisedError.new("Your meaningful message!")
end
end
end
end
Rails源代码的原始代码位于Persistence class。所有持久性方法通常在内部使用create_or_update
方法。因此,您可以考虑改为覆盖该方法。但是,您需要查看代码并查看这是否是个好主意。