Rails,使用隐藏字段设置用户角色
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails,使用隐藏字段设置用户角色相关的知识,希望对你有一定的参考价值。
我有一个单一的设计用户模型。用户角色可以是:A,B或admin。
首次注册时,我想基于2个按钮之一设置用户角色 - 按钮A或按钮B.然后,我将根据这些角色自定义网站。
我目前的尝试是将每个按钮(A或B)链接到具有隐藏字段的设计表单的单独页面,其中隐藏字段包括A或B.
目前我正在获取未经许可的params:这样做时我的日志中的角色。继承人我的用户设计控制器:
class Users::RegistrationsController <
Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:role])
end
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:role])
end
end
我也不确定这种设置角色的方式是否安全,因为一个坏人我可以通过这种方式设置他们作为管理员的角色。
所以我猜这里有更安全或更简单的做事方式。
表格 - 一个有B的隐藏字段,一个有A.
<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<%= f.input :email %>
<%= f.input :password %>
<%= f.input :password_confirmation %>
<%= f.hidden_field :role, value: 'A' %>
<%= f.button :submit, "Sign up" %>
<% end %>
答案
通常,您永远不应该在注册表单中接受权限信息。
什么会阻止用户将role
值的隐藏html输入更改为admin
或其他?我假设您正在使用role
列获取其他权限信息。
我建议你:
- 不接受来自的角色参数
- 使用单独的列指定可视布局而不是权限,因为这可能最终导致相互冲突的问题
如果你的代码提到你必须使用role
属性,我建议你根据表单中传递的非持久值在控制器中手动设置值。
形成:
<%= hidden_field_tag :layout, value: 'A' %>
控制器:
class Users::RegistrationsController < Devise::RegistrationsController
after_action :set_layout, only: [:create]
protected
def set_layout
@resource.update(role: selected_layout)
end
# This will whitelist the possible options
def selected_layout
["A", "Other"].find { |layout_option| layout_option == params[:layout] }
end
end
以上是关于Rails,使用隐藏字段设置用户角色的主要内容,如果未能解决你的问题,请参考以下文章