LoginEngine : Associer un user et un article.

Posted by Pierre Rigal on août 23, 2006

Voilà la dernière partie de mon tour d’horizon sur le LoginEngine ! Nous avons vu comment installer le LoginEngine, puis comment le surcharger, nous allons maintenant voir comment l’utiliser dans le cadre d’une application classique (telle qu’un petit blog.)

Prérequis

  1. Avoir une “mini” application foncitonnelle. (Le résultat d’un scaffold pour un modèle “article” composé d’un titre et d’un corps devrait amplement suffire !)
  2. Avoir installé le LoginEngineavec succès.
  3. Avoir compris comment fonctionnnait la surcharge. (J’utiliserai le mécanisme dans cet article mais je ne le réexpliquerai pas ;) )
  4. Avoir 2 ou 3 notions de base de donnée ;)
  5. Avoir … 2 minutes devant soi ;)

Let’s go baby !

Prenons notre exemple de “mini blog”, afin de savoir quel utilisateur écrit quel article la base de donnée doit prévoir de stocker l’id de l’utilisteur pour chaque article. Ainsi, si ce n’est pas déjà fait, ajouter le champs ‘user_id’ à votre table article.

$ ruby script/generate migration add_user_info_to_article

Insérez ceci dans le fichier créé :

class AddUserInfoToArticle < ActiveRecord::Migration
  def self.up
    add_column :articles, :user_id, :integer #libre à vous d'ajouter d'autres paramètres...
  end

  def self.down
    remove_column :articles, :user_id,
  end
end

Puis :

$ rake db:migrate

Maintenant, au sein de votre application, générer le modèle et le controller “user” pour la surcharge. Il faut ensuite indiquer au modèle “user.rb” qu’un utilisateur peut écrire de 0 à N articles. (C’est fait avec la ligne has_many)

class User < ActiveRecord::Base
 has_many :articles
 include LoginEngine::AuthenticatedUser
end

Et indiquer au modèle article qu’il appartient à un utilisateur :

class Article < ActiveRecord::Base
  belongs_to :user
end

Pour finir, à chaque création d’un article il faut associer l’utilisateur courant (en session.). En se basant sur le scaffold du controlleur pour gérer les articles, voici ce que cela donne :

class AdminArticlesController < ApplicationController
  before_filter :login_required
  ...
  def create
   @article = Article.new(params[:article])
   @article.user=session[:user] # ici !
   if @article.save 
     flash[:notice]= 'Article was successfully added.'
     redirect_to :action => 'list'
   else
     render :action => 'new'
   end 
 end
 ...
end

Ok… et c’est possible d’empécher l’accès à l’admin pour les users simples ?

Oui c’est possible :) . Pour cela on va redéfinir la méthode “authorize?” du LoginEngine.

NB : J’ai mis le code dans le helper de l’article. Je ne sais pas si c’est le meilleur endroit, mais ça fonctionne.

Donc éditez votre helper, nous allons utiliser un champs existant du LoginEngine “role” non implémenté pour l’instant.

module AdminArticlesHelper
  module LoginEngine
    module AuthenticatedSystem
      protected

      # Overwrited method
      # Only allow admin to enter this controller
      def authorize?(user)
        user.role == "admin"
      end
    end
  end
end

Ainsi seul les utilisateurs avec le rôle “admin” pourront utiliser ce controleur !

Pour aller toujours plus loin.

Parcequ’il parait que c’est toujours mieux ailleurs, un de mes prochains articles traitera encore de la gestion d’utilisateurs. Ce sera à propos d’un système d’un autre type que je viens de découvrir : un générator appelé auth_generator.

Trackbacks

Use this link to trackback from your own site.

Comments

Leave a response

  1. Zfred lun, 05 fév 2007 14:46:43 CET

    Il est hyper bien le auth_generator de Fabien Penso. Tu perdra pas du temps à le tester ;)

  2. Pierre Rigal lun, 05 fév 2007 20:48:35 CET

    Oui il est effectivement très bien et si tu navigues un peu sur mon blog tu verras que je l’ai déjà testé !

    En passant, j’ai aussi testé le actasauthenticated et personnelement c’est mon préféré, il est très souple à utiliser.

  3. […] Je vais donc commencer (ou plutôt reprendre) ce tour d’horizon avec actsasauthenticated. Je sais, j’ai déjà parlé à plusieurs reprises 1 2 3 4 de systèmes permettant de traiter l’identification avec Rails, cependant je ne pouvais pas en dire autant sans parler du plugin que j’utilise maintenant sur tout mes projets : actsasautenticated. […]

Comments (Syntaxe Markdown)