• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_certifying

Got it!

Last updated on 1/17/17

Assignez différents droits à vos utilisateurs

Log in or subscribe for free to enjoy all this course has to offer!

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.

Example of certificate of achievement
Example of certificate of achievement