【发布时间】:2018-09-15 12:21:59
【问题描述】:
在我的应用程序中,我有一个包含 id, account_id, user_id, resource_type, resource_id, and role 列的权限表。使用 Pundit,当用户尝试访问特定资源时,我需要检查许多可能的权限记录,以便他们查看/编辑页面。我正在寻找最有效的方法来获取所有Permissions.where(account_id: params[:account_id] && user_id: current_user.id),然后循环遍历它们以获得所有可以授予访问权限的值:
is_user_account_owner?
is_user_account_admin?
is_user_resource_moderator?
is_user_parent_resource_admin?
is_user_parent_resource_moderator?
is_user_parent_resource_viewer?
is_user_resource_viewer?
如果这些检查中的任何一个为真,则用户可以查看资源并且不需要进行其余检查。每次页面浏览都会发生这种情况,因此我将不胜感激任何关于如何使这种高效/可扩展的建议,特别是想要一些关于如何在此处实现缓存的建议。
【问题讨论】:
-
这真的取决于权限是如何实现的。此外,除了查询缓存之外,您不能真正使用缓存,因为每个客户端的结果都是唯一的。
-
您能否描述更多您认为我在描述我如何实现权限时遗漏的内容?很基本; pundit per action 查找 Permissions 记录,如果存在某些值,则授予/拒绝访问
-
你能展示你的权威实现吗?你不能(也不应该)在策略中正常访问
params[:account_id],所以我不清楚你是怎么写的。 -
什么是“特定资源”?任何属于
Account的东西?数据是如何建模的? -
为什么会这样?如果我在政策受到打击之前从 params 中提取或仅设置 @account_id = params[:account_id] 有什么区别?我会向您展示我的权威代码,但我还没有编写它,因为在我开始编码之前我仍然处于思维导图过程中我将如何实现它
标签: ruby-on-rails ruby activerecord permissions access-control