2011-01-06 2 views
2

Je viens de commencer Rails 3. J'ai généré le code ci-dessous en utilisant l'échafaudage de Rails 3 sur une table appelée "Logs".Restriction de la manipulation d'url pour retourner d'autres enregistrements utilisateur

La fonction 'index' ci-dessous fournit uniquement les enregistrements associés à current_user.id (à partir de la session stockée dans la table de session). Les utilisateurs uniquement les enregistrements sont présentés avec l'itinéraire suivant est enregistré en tant qu'utilisateur = 3 (voir code index ci-dessous)

localhost: 3000/logs

Problème: En tant qu'utilisateur, je peux voir un record qui n'est pas mon record (étant user = 3) en éditant l'URL manuellement pour montrer tout autre document:

localhost: 3000/logs/5 'a été créé par ce user.id = 2'

Recherche de solution: Comment empêcher le piratage manuel de l'URL pour empêcher un utilisateur de consulter d'autres enregistrements utilisateur?

classe LogsController < ApplicationController

before_filter: login_required

def index 
    @logs = Log.where(:user_id => current_user) 
    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @logs } 
end 

S'il vous plaît ignorer que la nouvelle fonction est absente de la fonction de création ci-dessous. Le code ci-dessous est de montrer simplement que je mets le user_id dans la section « Journaux » Table

def create 
@log = Log.new(params[:log]) 
@log.user_id = current_user.id 
    respond_to do |format| 
    if @log.save 
    format.html { redirect_to(@log)} 
    format.xml { render :xml => @log, :status => :created, :location => @log } 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @log.errors, :status => :unprocessable_entity } 
    end 
end 

Répondre

4

La solution la plus simple serait de vérifier dans la méthode show si le journal pour afficher vraiment appartient à l'utilisateur connecté à l'utilisateur:

def show 
    @log = Log.find(params[:id]) 
    unless @log.user_id == current_user.id 
    flash[:error] = "unauthorized" 
    redirect_to :index 
    end 
end 

Mais vous allez bientôt avoir plus de choses que vous souhaitez restreindre l'accès à, de sorte que vous devriez chercher un plugin d'authentification qui permet de définir les droits d'accès d'une manière déclarative. Peut-être celui-ci:

+0

Merci beaucoup pour la recommandation ACL. L'authentification est évidemment différente de l'autorisation. Toujours dans mon enfance avec Rails et tout ce que j'ai l'air de lire est flou entre la syntaxe de Ruby et la syntaxe de Rails. J'ai testé votre code et cela fonctionne en empêchant la manipulation de l'url. Lors de la manipulation de l'URL, il présente uniquement les enregistrements des utilisateurs. Cependant, j'ai remarqué que l'erreur de flash ne se produira jamais. – fresh

+0

Désolé, je vois maintenant "Non autorisé" lors de la migration de l'URL. Merci encore pour votre temps. – fresh

+0

Vous avez raison, je voulais dire l'autorisation, désolé de mélanger cela. Le message flash n'est pas affiché? Vous avez besoin d'une instruction dans votre vue qui génère des messages si présents. Je ne sais pas si le générateur le crée automatiquement. –

Questions connexes