web-dev-qa-db-fra.com

Rails 4 rôles d'utilisateur et autorisations

J'écris une application Rails pour une organisation. Chaque utilisateur peut avoir un ou plusieurs rôles et ne peut accéder qu'à certaines actions du contrôleur en fonction de ces rôles.

Par exemple, seuls admins peuvent créer, détruire et mettre à jour certains champs de Users. De plus, il existe Teams qui ont chacun un team leader, et seul le team leader peut mettre à jour certaines informations sur Team (comme la liste des membres, par exemple). Cependant, Admins est celui qui assigne le chef d'équipe en premier lieu.

Les détails spécifiques de mon scénario ne sont pas importants, j'espère seulement avoir décrit la situation dans laquelle il existe de nombreux rôles et autorisations.

Ma question est: quel bijou utiliser? Ma première pensée a été CanCan, mais le dernier commit remonte à presque un an et la compatibilité avec Rails 4 n’est pas mentionnée. Existe-t-il une alternative actuellement maintenue?

17
gdiazc

Votre première hypothèse était correcte, utilisez cancancan et vous maîtriserez mieux ce problème.

EDIT 24 juillet 2015

J'utilise Cancancan depuis longtemps maintenant et cela fonctionnait toujours très bien. J'ai récemment changé d'emploi et ici (nous) utilisons Pundit pour obtenir une autorisation.

C'est génial. Il vous invite à définir la stratégie pour chaque ressource et cela semble plus naturel qu'une classe de capacité surestimée.

Pour des projets plus importants, je recommanderais certainement Pundit. 

27
Andrey Deineko

Pour contrôler l'accès aux actions, je recommanderais Action Access , cela se résume à ceci:

class UsersController < ApplicationController
  let :admin, :all
  let :user, [:index, :show]

  # ...
end

Cela verrouille automatiquement le contrôleur, permettant ainsi aux administrateurs d'accéder à toutes les actions, aux utilisateurs d'afficher ou d'indexer les utilisateurs uniquement. Toute autre personne sera rejetée et redirigée avec une alerte.

Si vous avez besoin de plus de contrôle, vous pouvez utiliser les actions not_authorized! inside pour vérifier et refuser l'accès.

C'est complètement indépendant du système d'authentification et il peut fonctionner sans modèles User ni rôles prédéfinis. Tout ce dont vous avez besoin est de définir le niveau de clairance pour la demande en cours:

class ApplicationController < ActionController::Base
  def current_clearance_level
    session[:role] || :guest
  end
end

Vous pouvez retourner tout ce dont vous avez besoin ici, comme par exemple current_user.role.

Bien que cela ne soit pas obligatoire, il regroupe un ensemble d’ajouts de modèles pratiques permettant d’effectuer des tâches telles que:

<% if current_user.can? :edit, :team %>
  <%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>

Ici :team fait référence à TeamsController, le lien ne sera affiché que si l'utilisateur actuel est autorisé à accéder à l'action edit dans TeamsController. Il supporte également namespaces.

Vous pouvez verrouiller les contrôleurs par défaut, personnaliser le chemin de redirection, le message d'alerte, etc.

C'est très simple et facile, j'espère que vous le trouverez utile.

5
404

Quelque chose m'a été suggéré que nous utilisons maintenant est le petergate gem. Facile à utiliser et très propre avec une bonne sensation de Rails.

Fonctionne bien avec conçoit .

Voici quelques exemples du readme.

Si vous utilisez la technologie, vous avez de la chance, sinon vous devrez ajouter les méthodes suivantes à votre projet:

user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user! 

Cela vient dans votre User.rb. Ajouter plus de rôles est aussi simple que de les ajouter au tableau.

petergate(roles: [:admin, :editor], multiple: false)

Méthodes d'instance

user.role => :editor
user.roles => [:editor, :user]
user.roles=(v) #sets roles
user.available_roles => [:admin, :editor]
user.has_roles?(:admin, :editors) # returns true if user is any of roles passed in as params.

Syntaxe d'accès au contrôleur.

access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all
2
Jake