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列获取其他权限信息。

我建议你:

  1. 不接受来自的角色参数
  2. 使用单独的列指定可视布局而不是权限,因为这可能最终导致相互冲突的问题

如果你的代码提到你必须使用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,使用隐藏字段设置用户角色的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?

Ruby on Rails(三)隐藏部分视图

如何使用jquery计算某个类的隐藏div的数量

Rails:允许用户在注册时选择他们的角色设计

用户权限 - 用户角色触发代码 (Wordpress)

通过 Rails 5 中的另一个模型继承关联