我有一个设计用户模型。用户角色可以是: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 %>
答案 0 :(得分:3)
通常,您永远不应该在注册表单中接受权限信息。
什么会阻止用户将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