Le blog de la CT2C

Mémo Rolify Cancan

Par Arpsara , publié le 21 Novembre 2012

Ceci est un mémo. Il ne s'agit pas d'un tutoriel mais d'un guide rapide pour mettre en place les Gems Rolify et Cancan et les faire fonctionner ensemble.


Pour quoi faire ?

Rolify pour donner des rôles aux utilisateurs: administrateur, modérateur...
Cancan pour manager les droits + facilement: peut écrire, peut supprimer, etc.

Mise en place

https://github.com/EppO/rolify
https://github.com/ryanb/cancan

Installer les gems
Ajoutez ces deux gems dans votre Gemfile.rb, puis faites un bundle install
gem "rolify"
gem "cancan"

Créer les différents Models

Dans votre terminal, lancez les commandes suivantes:
rails g rolify:role Role User # Pour les rôles
rails g cancan:ability # Pour les permissions
rake db:migrate

Ce que ça créée, pour vos rôles: Migration + Model Roles.rb + "rolify" dans User.

Migration:
def change
create_table(:users_roles, :id => false) do |t|
t.references :user, :null => false
t.references :role, :null => false
end

add_index(:roles, :name)
add_index(:roles, [ :name, :resource_type, :resource_id ])
add_index(:users_roles, [ :user_id, :role_id ])
end

Model Role.rb
class Role < ActiveRecord::Base
has_and_belongs_to_many :users, :join_table => :users_roles
belongs_to :resource, :polymorphic => true
scopify
end

Dans Model User.rb
class User < ActiveRecord::Base
rolify
end

Pour les permissions:

Dans ability.rb
class Ability
include CanCan::Ability

def initialize(user)
#C'est ici qu'on va définir les rôles
end
end

Comment ça marche ?

1- Définir les rôles que peuvent avoir les utilisateurs
Cela se fait directement dans la console.
 
user = User.find(1)
user.add_role :admin

Vous pouvez définir autant de rôles que vous le souhaitez, pour toutes les ressources que vous souhaitez. Plus de détails sur la page officielle de Rolify.

Pour voir tous les rôles que vous avez créé, il vous suffit de taper la commande suivante.
Roles.all

2- Les permissions
Cela se fait dans le fichier "ability.rb" généré par la gem Cancan. Exemple
class Ability
include CanCan::Ability

def initialize(user)
user ||= User.new # Cherche l'utilisateur courant ou crée un utilisateur avec le statut non connecté
if user.nil? then
## Droit à rien, non mais...
else
case user.has_role? #grâce à gem Rolify, on cherche les rôles de l'utilisateur
when :admin
can :manage, :all # Et là, on lui donne les permissions souhaitées
when :moderator
can :read, Forum
can :update, Post
else
#can :manage, Post, :id => 2
#can :manage, Category, :id => 2
end
end
end

3- Dans la vue
Au final, on cherche à afficher telle ou telle donnée en fonction du rôle. Has_role n'étant défini que lorsque l'utilisateur est connecté, on utilise la méthode de la gem Devise pour savoir si l'utilisateur est connecté ou pas. :)
<% if user_signed_in? && (current_user.has_role? :admin) %>
<%= link_to "Nouvelle Catégorie", new_forum_category_path %>
<% else %>
Pas touche
<% end %>

Et voilà ! :)


Index -- --

  • Aucun commentaire - Soyez le premier !

Insérez votre commentaire
  1. Min: 50 caractères, Max: 800. Actuellement: 0 caractères

  2. ne pas remplir