• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/01/2017

Assignez différents droits à vos utilisateurs

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Bonne nouvelle, dans ce chapitre, pas de nouvelle difficulté : je vais juste vous montrer comment appliquer ce que vous savez déjà pour limiter l’accès à certaines vues et actions à un certain type d’utilisateurs. Cela permet par exemple de faire des modérateurs sur un forums ou des administrateurs sur un site.

Pour distinguer les simples utilisateurs des administrateurs, ajoutez la colonne role  à votre table d'utilisateurs.

rails g migration AddRoleToUsers
# db/migrate/*_add_role_to_users.rb
class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string
  end
end
rake db:migrate

Puis, dans la console rails, pour l’utilisateur de votre choix (le premier en ce qui me concerne), modifiez la valeur de son rôle pour admin  :

User.first.update role: "admin"

Dans vos contrôleurs et vues, il n’y a plus qu’à vérifier la valeur du rôle de l’utilisateur pour afficher ou non un lien et pour autoriser ou non une action dans le contrôleur :

# app/views/users/home.html.erb
<% if @current_user %>
  <% if @current_user.role == "admin" %>
    <h1>Bienvenue administrateur <%= @current_user.name %> !</h1>
  <% else %>
    <h1>Bienvenue <%= @current_user.name %> !</h1>
  <% end %>
<% else %>
  <h1>Bienvenue visiteur anonyme !</h1>
  <a href="/users/login">S'identifier</a>
<% end %>

Pour interdire l’accès à une fonction du contrôleur si l’utilisateur n’est pas administrateur, ajoutez ces lignes au début de votre fonction :

if !@current_user || @current_user.role != "admin"
  return head :forbidden
end

Une notation plus courte existe, l’effet est exactement le même :

if @current_user.try(:role) != "admin"
  return head :forbidden
end

La fonction derrière le try n’est appelée que si le @current_user n’est pas nil.

Voici un exemple de ce que l’on peut mettre à la place du return head :forbidden pour rediriger l’utilisateur :

if @current_user.try(:role) != "admin"
  flash[:error] = "Accès interdit"
  return redirect_to request.referrer || root_path
end

request.referrer désigne la page de provenance de l’utilisateur. Le root_path désigne la page d’accueil du site mise en place dans le fichier config/routes.rb. Il est utile si l’utilisateur a saisi à la main l’adresse interdite dans son navigateur, auquel cas request.referrer vaudrait nil.

Exemple de certificat de réussite
Exemple de certificat de réussite