Mémo Rolify Cancan
- Catégories:
- Ruby On Rails
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/rolifyhttps://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 utilisateursCela 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
--
Article précédent: Nouvelle bannière pour Lilas et Cabochons
--
Article suivant: Installer Ruby on Rails sous Linux
Aucun commentaire - Soyez le premier !