2017-08-26 2 views
0

Ich bin relativ neu zu Schienen (und Codierung) und mein Verständnis ist nicht 100% auf diesem, ich habe versucht, starke params Dokumentation auf Anforderung lesen, und bin nicht in der Lage, das Problem zu lösen.Ist das eine unsichere Art, starke Params für Schienen zu verwenden?

Ich habe Benutzer und Administratoren mit Pundit für eine Website erstellt. Ich habe ein Dashboard erstellt, auf das nur Administratoren zugreifen können. Es bietet einen Überblick über alle Benutzer, eine Möglichkeit, sie zu löschen, und eine Möglichkeit, ihre Rolle zu ändern. Soweit ich weiß, verwendet dies die update-Methode users_controller, die in user_params übergeben wird.

Die Benutzer-Update-Methode ist auch, aus dem, was ich verstehe, für Benutzer verwendet, um ihr eigenes Profil zu bearbeiten (E-Mail ändern, etc.) und ich bin besorgt, dass ich eine Möglichkeit für sie eine Rollenänderung übergeben haben durch die Form irgendwie.

Ist dies der richtige Weg? Oder sollte ich einen neuen Satz von Parametern für den Rollenwechsel erstellen, die ausschließlich auf der Benutzer-Dashboard-Seite verwendet werden - wenn ja, wie würde ich dies tun?

Ich fühle mich wie ich vermisse, oder ein paar Dinge hier.

user_controller.rb: Klasse Userscontroller < Application

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 

Dashboardseite:

<% @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 %> 

und schließlich 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

Warum autorisieren Sie Benutzer __after__ Sie das Update durchgeführt? –

Antwort

0

Du hast Recht - Wenn Benutzer eine Rolle übergeben, können sie diese ändern. Es gibt eine Möglichkeit, verschiedene erlaubte Parameter für verschiedene Rollen anzugeben, die in der README (https://github.com/elabs/pundit#user-content-strong-parameters)

beschrieben werden. Ich habe auch bemerkt, dass Sie in der Aktion #update zuerst den Benutzer aktualisieren und dann autorisieren. Sie sollten die Bestellung wechseln:

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