Rails,使用隐藏字段设置用户角色

时间:2017-12-18 17:40:11

标签: ruby-on-rails devise

我有一个设计用户模型。用户角色可以是: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 %>

1 个答案:

答案 0 :(得分:3)

通常,您永远不应该在注册表单中接受权限信息。

什么会阻止用户将role值的隐藏HTML输入更改为admin或其他?我假设您正在使用role列获取其他权限信息。

我建议你:

  1. 不接受来自
  2. 的角色参数
  3. 使用单独的列来指定可视布局而非权限,因为这可能会导致最终出现冲突的问题
  4. 如果你的代码提到你必须使用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