2017-08-26 163 views
0

我是比較新的軌道(編碼),我的理解是不是這個100%,我試圖讀出需要強有力的PARAMS文件,並且是無法解決問題的。這是一個不安全的方式使用強大的params導軌嗎?

我創建使用權威人士對網站用戶和管理員。我創建了一個只有管理員才能訪問的儀表板,它提供了所有用戶的概述,刪除它們的方法以及更改角色的方法。據我所知,這使用user_params中傳遞的users_controller更新方法。

用戶更新的方法也,從我個人理解,用於用戶編輯自己的個人資料(變更電子郵件等),我擔心,我添加了一個方式,爲他們傳遞一個角色的轉變以某種方式通過表單。

這是去了解這個正確的方式?或者我應該爲角色更改創建一組新的參數,這些參數僅在用戶儀表板頁面上使用 - 如果是這樣,我將如何執行此操作?

我覺得我缺少一個,或在這裏的幾件事情。

user_controller.rb: 類UsersController < ApplicationController的

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 
+0

爲什麼你授權用戶__after__你做了更新? –

回答

0

你說得對 - 如果用戶通過角色,他們將能夠改變它。 有指定的權威人士README(https://github.com/elabs/pundit#user-content-strong-parameters

我也注意到,在#UPDATE動作你第一次更新,然後授權用戶描述的不同角色允許PARAMS的方式。 您應該切換順序:

def update 
    authorize @user 
    if @user.update(user_params) 
    ... 
    end 
end 
相關問題