如何在 Rails 中实现仅对模型特定属性的基于角色的授权?
How to implement role-based authorization to only specific attributes of a model in Rails?
我有一个 Accounts
资源(模型 + 控制器)。目前,AccountsController
的所有操作都在 authorize_admin
before_action
之前,它检查用户是否是管理员,如果不是,它会将用户重定向到 home_path
.
我现在想做的是允许用户编辑自己帐户的一些字段。我不知道该怎么做。我有几个想法:
在同一帐户控制器中创建自定义 edit_personal_account
和 update_personal_account
操作,使用自定义 personal_account_params
(Rails 4,强参数)。在 personal_account_params
中,我将 permit
仅允许用户编辑的字段。
创建一个具有正常 restful 操作的新 PersonalAccounts
控制器,但只有 edit
、update
和 show
。此控制器将再次与 Account
模型交互。
使用 gem,例如 cancancan
或 pundit
。我浏览了他们的文档和维基,但到目前为止,我只找到了如何根据角色限制对整个操作的访问的示例,而不是如何限制对特定字段的访问的示例。
所以我的问题是 - 三种方式中哪一种最适合我的场景,还有其他更好的方式吗?
这样的怎么样?
# accounts_controller.rb
before_action :authorize_admin, except: [:edit, :update]
def update
@account.update(account_params)
end
private
def account_params
if current_user.admin?
params.require(:account).permit(<all params>)
else
params.require(:account).permit(<subset of params>)
end
end
这样您就可以在 account_params
方法中明确声明普通用户可以编辑哪些参数,这可能是您想要的,也可能不是您想要的。
您还需要根据当前用户的角色隐藏 edit
视图中的某些字段(即,如果她是管理员,则什么都不隐藏等),但这应该不会很难.您甚至可以创建自定义表单生成器。
我有一个 Accounts
资源(模型 + 控制器)。目前,AccountsController
的所有操作都在 authorize_admin
before_action
之前,它检查用户是否是管理员,如果不是,它会将用户重定向到 home_path
.
我现在想做的是允许用户编辑自己帐户的一些字段。我不知道该怎么做。我有几个想法:
在同一帐户控制器中创建自定义
edit_personal_account
和update_personal_account
操作,使用自定义personal_account_params
(Rails 4,强参数)。在personal_account_params
中,我将permit
仅允许用户编辑的字段。创建一个具有正常 restful 操作的新
PersonalAccounts
控制器,但只有edit
、update
和show
。此控制器将再次与Account
模型交互。使用 gem,例如
cancancan
或pundit
。我浏览了他们的文档和维基,但到目前为止,我只找到了如何根据角色限制对整个操作的访问的示例,而不是如何限制对特定字段的访问的示例。
所以我的问题是 - 三种方式中哪一种最适合我的场景,还有其他更好的方式吗?
这样的怎么样?
# accounts_controller.rb
before_action :authorize_admin, except: [:edit, :update]
def update
@account.update(account_params)
end
private
def account_params
if current_user.admin?
params.require(:account).permit(<all params>)
else
params.require(:account).permit(<subset of params>)
end
end
这样您就可以在 account_params
方法中明确声明普通用户可以编辑哪些参数,这可能是您想要的,也可能不是您想要的。
您还需要根据当前用户的角色隐藏 edit
视图中的某些字段(即,如果她是管理员,则什么都不隐藏等),但这应该不会很难.您甚至可以创建自定义表单生成器。