2010-09-30 5 views
2

Je suis assez nouveau à Ruby On Rails et maintenant je fais une application simple. Dans cette application, un utilisateur peut créer de nombreux éléments et j'utilise concevoir pour l'authentification. Ofcourse Je veux vous assurer que vous êtes le propriétaire afin de supprimer des éléments (équipes, joueurs, etc.) et la façon dont je le fais maintenant:La meilleure façon de limiter les actions (modifier/supprimer) avec Ruby on Rails and Devise

def destroy 
    @team = Team.find(params[:id]) 
    if current_user.id == @team.user_id 
     @team.destroy  
     redirect_to(teams_url, :notice => 'The team was deleted.') 
    else 
     redirect_to root_path 
    end  
end 

Est-ce la meilleure façon? Je pensais à mettre une méthode dans le modèle mais je ne suis pas sûr de pouvoir accéder à current_user à partir de là. Je pensais aussi à un before_filer, quelque chose comme:

before_filter :check_ownership, :only => [:destroy, :update] 

Je cette affaire et si je veux coder une seule méthode pour tous les objets (tous les objets Concerne un « user_id » -field)

Répondre

1

dans mon contrôleur d'application je mets:

before_filter :authorize 

def authorize 
    false # Or use code here to check if user is admin or not 
end 

Puis-je remplacer la méthode dans mon contrôleur authorize réel pour permettre l'accès à diverses actions.

+0

Oui, je fais ça. Les utilisateurs qui ne sont pas connectés peuvent utiliser Index/Show. Pour créer, vous devez être connecté. Mais la question était de savoir si un objet sur le point d'être détruit ou modifié appartient vraiment à l'utilisateur ou si l'action est effectuée par un administrateur. –

+1

Pour être sûr que l'utilisateur ne peut modifier que les éléments qu'il possède, je le fais: @team = current_user.teams.find (params [: id]) Généralement, je fais un jeu de contrôleurs séparé pour les fonctions d'administration. – drummondj

+0

Je dois essayer ça. Cela semble être une bonne solution. –

0

Vous êtes à la recherche d'une solution d'autorisation au-dessus de votre authentification (concevoir)

Vous ne pouvez pas accéder à l'utilisateur actuel dans le modèle non. J'ai eu beaucoup de succès en utilisant Makandra's Aegis pour l'autorisation. Il vous permet de créer des rôles et de spécifier les autorisations attribuées à chaque rôle. Les docs sont plutôt bons et je sais que ça fonctionne bien avec Devise, c'est assez agnostique, je l'ai aussi utilisé avec Clearance. Il transmet également un "current_user" implicite à vos autorisations afin que vous puissiez spécifier et vérifier que votre utilisateur actuel peut prendre les mesures appropriées.

Questions connexes