2017-08-26 3 views
0

Je suis relativement nouveau sur les rails (et le codage) et ma compréhension n'est pas à 100% sur ce sujet, j'ai essayé de lire la documentation des paramètres forts sur require, et je suis incapable de résoudre le problème.Est-ce une façon non sécurisée d'utiliser des paramètres forts pour les rails?

J'ai créé des utilisateurs et des administrateurs en utilisant Pundit pour un site. J'ai créé un tableau de bord auquel seuls les administrateurs peuvent accéder, ce qui donne un aperçu de tous les utilisateurs, un moyen de les supprimer et un moyen de changer leur rôle. D'après ce que je comprends, cela utilise la méthode de mise à jour users_controller qui passe dans user_params. La méthode de mise à jour de l'utilisateur est également, d'après ce que je comprends, utilisé pour les utilisateurs d'éditer leur propre profil (changement de courriel, etc.) et je suis inquiet que je leur ai ajouté un moyen de passer un changement de rôle à travers la forme en quelque sorte.

Est-ce la bonne façon de procéder? Ou devrais-je créer un nouvel ensemble de paramètres pour le changement de rôle, qui sont uniquement utilisés sur la page du tableau de bord de l'utilisateur - si oui, comment le ferais-je? J'ai l'impression d'en manquer une ou quelques petites choses ici.

user_controller.rb: classe 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 

page Tableau de bord:

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

et enfin 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

Pourquoi autorisez-vous l'utilisateur __après avoir effectué la mise à jour? –

Répondre

0

Vous avez raison - Si les utilisateurs passent un rôle, ils seront en mesure de le changer. Il est un moyen de spécifier params différentes autorisées pour les différents rôles décrits dans le README pundit (https://github.com/elabs/pundit#user-content-strong-parameters)

J'ai aussi remarqué que dans l'action #update vous devez d'abord mettre à jour et autoriser l'utilisateur. Vous devez changer la commande:

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