这是为 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
我对 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