这是为 rails 使用强参数的不安全方式吗?

Is this an un-secure way of using strong params for rails?

我对 rails(和编码)比较陌生,对此我的理解不是 100%,我已经尝试阅读有关 require 的强大参数文档,但无法解决问题.

我使用 Pundit 为网站创建了用户和管理员。我创建了一个只有管理员可以访问的仪表板,它提供了所有用户的概览、删除用户的方法以及更改用户角色的方法。据我了解,这使用 users_controller 更新方法,该方法传入 user_params.

据我了解,用户更新方法也用于用户编辑自己的个人资料(更改电子邮件等),我担心我已经为他们添加了一种传递角色的方法通过表格以某种方式更改。

这是解决这个问题的正确方法吗?或者我应该为角色更改创建一组新的参数,这些参数仅在用户仪表板页面上使用 - 如果是这样,我该怎么做?

我觉得我错过了一个,或者一些东西。

user_controller.rb: class 用户控制器 < 应用程序控制器

  before_filter :authenticate_user!
  after_action :verify_authorized
  before_action :set_user, only: [:edit, :update, :show, :destroy]


def update
    if @user.update(user_params)
       authorize @user
      flash[:success] = "Profile updated successfully!"
      redirect_to @user
    else
      render 'edit'
    end
end

   def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
      cookies.signed[:user_id] = @user.id
      flash[:success] = "Welcome #{@user.username} to Day One"
      redirect_to user_path(@user)
    else
      render 'new'
    end
   end

  def show 
    authorize @user
  end

  def destroy
      authorize @user
      @user.destroy
      flash[:danger] = "User and all their related goals have been deleted"
      redirect_to users_path
  end

  def user_dashboard
    @users = User.all
    authorize User
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password, :password_confirmation, :profileimage, :role)
  end


  def set_user
    @user = User.find(params[:id])
  end

end

仪表板页面:

 <% @users.each do |user| %>
          <tr>
            <td>
              <%= link_to user.email, user %>
            </td>
            <td>
              <%= form_for(user) do |f| %>
                <%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %>
                <td>
                <button><%= f.submit 'Change Role' %></button>
                </td>
              <% end %>

最后是 user_policy.rb:

class UserPolicy < ApplicationPolicy
  attr_reader :current_user, :model

  def initialize(current_user, model)
    @current_user = current_user
    @user = model
  end  

  def index?
    @current_user.admin?
  end

  def show?
    # scope.where(:id => record.id).exists?
  end

  def create?
    false
  end

  def new?
    create?
  end

  def update?
    @current_user.admin? || @current_user == @user
  end

  def edit?
    @current_user.admin? || @current_user == @user
  end

  def destroy?
    @current_user.admin? 
  end

  def user_dashboard?
    @current_user.admin? 
  end


end

你说得对 - 如果用户传递了一个角色,他们将能够更改它。 有一种方法可以为专家 README (https://github.com/elabs/pundit#user-content-strong-parameters)

中描述的不同角色指定不同的允许参数

我还注意到,在#update 操作中,您首先更新然后授权用户。 你应该调换顺序:

def update
  authorize @user
  if @user.update(user_params)
    ...
  end
end