Auth_generator : un autre système de login.

Posted by Pierre Rigal on septembre 03, 2006

J’ai beaucoup apprécié le fonctionnement du LoginEngine, l’idée d’utiliser ce système pour gérer les authentifications permet de fournir une base robuste qui pourra être améliorée au besoin par chacun dans sa propre application.

Cependant, étant du genre “moins j’en fais, mieux j’me porte” j’ai cherché s’il n’existait pas plus complet comme système d’authentification sur le marché “Ruby On Rails”.

Ainsi, je suis tombé sur le auth_generator de Fabien Penso. A première vue, c’est bien ce que je recherche, en y regardant plus loin, cela semble presque “parfait” : je teste !

Principe d’un generator.

Si vous débutez comme moi, vous devez vous y perdre un peu entre les differentes extensions de RubyOnRails. On trouve des plugins, des engines mais aussi des generator. En fait dans la classification RubyOnRails, les engines et les generator sont des plugins mais d’un type different. On a vu ce qu’étais les engines dans un précédent article, penchons nous maintenenant sur un generator.

Comme son nom l’indique, un generator va permettre de générer du code. Le code ainsi généré est implanté directement dans votre application. (Les controllers avec les controllers, les vues avec les vues, etc…)

Ce principe est un peu plus “rustique” qu’un engine, le code est directement dans l’application, il suffit de le modifier pour modifier le comportement de l’application. Ainsi, à première vue cela parait plus facile d’accès mais un peu moins robuste car si un jour le code du generator évolue et qu’on veuille le mettre à jour il faudra auparavant identifier toutes les modifications, chose que nous n’avions pas à faire avec le LoginEngine de part sa structure externe à l’application en cours de développement.

Alors pourquoi continuer avec le auth_generator ? … Tout simplement car il semble un peu mieux “fini” ;)

Récuperation de la gem

Le auth_generator se présente sous forme de gem, il suffit alors de la récupérer sur son système.

$ sudo gem install http://penso.info/tmp/auth_generator/auth_generator-2.0.1.gem

Il faut ensuite l’incorporer à sa propre application. (à la racine de votre appli)

$ ./script/generate auth auth authadmin

NB : il faut faire attention au fait que c’est un generator, ainsi veillez à ce que le authgenerator n’écrase pas un modèle ou un controller que vous aurez déjà developpé.

Pour compléter l’installation il faut suivre les instructions du fichier README-ACCOUNT-LOGIN que je vais reprendre dans le prochain paragraphe.

Instructions d’installation

Controller

Modifiez votre ApplicationController (app/controllers/application.rb) afin qu’il ressemble à ce qui suit :

require 'auth_system'
class ApplicationController < ActionController::Base
  include AuthSystem
  helper :auth
  before_filter :app_config, :ident
  service :notification

  # Used to be able to leave out the action
  def process(request, response)
    catch(:abort) do
      super(request, response)
    end
    response
  end

  def this_auth
    @app
  end
  helper_method :this_auth
end

Modèle

Il faut dans un premier temps insérer le modèle en base de donnée. Pour respecter l’esprit RubyOnRails, nous allons créer un fichier de migration.

$ ruby script/generate migration add_auth_generator_model

Dans le fichier nouvellement créé ajoutez le code provenant du fichier db/auth_generator/shema.rb.

ActiveRecord::Schema.define do
 create_table "users", :force => true do |table|
   # table.column :id, :integer // this is implicit (when using create_table)
   table.column :login, :string, :limit => 80
   table.column :cryptpassword, :string, :limit => 40
   table.column :validkey, :string, :limit => 40
   table.column :email, :string, :limit => 100
   table.column :newemail, :string, :limit => 100
   table.column :ipaddr, :string
   table.column :created_at, :datetime
   table.column :updated_at, :datetime
   table.column :confirmed, :integer
   table.column :domains, :string
   table.column :image, :string
   table.column :firstname, :string
   table.column :lastname, :string
 end
end

Ensuite, indiquez à votre application de prendre en compte ces modifications :

$ rake db:migrate

Ainsi la nouvelle table sera ajoutée dans votre base de donnée.

Environement

Le auth_generator utilise les mails. Il faut donc configurer l’ActionMailer comme il se doit. (config/environment.rb)

Dans le cadre d’un environnement de développement sur une machine perso, nous n’avons pas de serveur d’envoie de mail disponible, voici donc le type de configuration à avoir :

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.server_settings = {
 :address => "mail.server.com", # votre smtp
 :authentication => :login,
 :user_name => "votrelogin",
 :password => "votrepassword",
}

Dans le cadre d’un environement de production, en général la machine dispose d’un système d’envoie d’email, la configuration suivante suffira alors :

ActionMailer::Base.delivery_method = :sendmail

Les Routes

Editez le fichier “config/routes.rb” et ajouter les 2 routes suivantes (une pour chaque controller)

map.auth 'auth/:action/:id',
  :controller => 'auth', :action => nil, :id => nil
map.authadmin 'authadmin/:action/:id',
  :controller => 'authadmin', :action => nil, :id => nil

Les routes ci dessus vont permettre d’accéder aux controllers. Cependant le fait de définir des routes permet surtout de changer le type d’url qui execute le controller. Aisin avec les routes précédentes ce sera http://votreapplication/authadmin qui vous permettra d’acceder à la gestion des utilisateurs.

Si vous voulez par exemple que ce soit http://votreapplication/users/admin écrivez ceci à la place du précédent :

map.authadmin 'users/admin/:action/:id',
  :controller => 'authadmin', :action => nil, :id => nil</code></pre>

Configration finale.

Pour finir l’installation de ce generator, il faut vérifier le fichier config/auth_generator.yml et configurer chaque variable comme vous le désirez.

Utilisation (enfin !)

Je vous conseille de lire la FAQ de Fabien Penso, qui vous permettra de comprendre comment bien utiliser son plugin.

Rapidement, si vous voulez protéger l’accès à une action d’un controller ecrivez ceci :

class VotreController < ApplicationController
  def action
    require_auth #action protégée
    ...
  end
  def action2
    require_auth 'editor' #action protégée disponible après login qu'aux editor
  end

Pour gérer vos utilisateurs, il faut un compte ayant le rôle admin (pour l’acces au /authadmin). Je n’ai pas trouvé d’autre moyen que de créer un compte grâce à l’interface du auth_generator (http://votreapplication/auth/signup) puis d’aller modifier son rôle en base de donné.

$ mysql> update users set domains="ADMIN,1" where login="votrelogin"

Pour aller plus loin.

Vous pouvez vous inspirez de la méthodologie utilisée dans le LoginEngine afin d’associer par exemple un utilisateur à un article (ou tout autre objet de votre application.)

J’arrèterai ici ma série d’articles sur les systèmes de gestion d’utilisteurs, je pense avoir fait un bon petit tour d’horizon maintenant !

Trackbacks

Use this link to trackback from your own site.

Comments

Leave a response

  1. Zfred ven, 09 fév 2007 13:26:38 CET

    Bonjour Pierre,

    Compte rendu magnifique encore une fois ;)

    Pour se connecter la 1ere fois, il faut aller sur l’adresse http://localhost:3000/authadmin Ainsi, tu crées ton 1er compte, qui est ‘admin’ par défaut. Ensuite, à partir de cette interface, tu peux gérer les users.

    Sinon, j’ai un sacré blocage avec ce module d’authentification : Je n’arrive pas à autoriser l’acces à un utilisateur appartenant à 1 domain OU un autre. grrr ça fait un moment que je cherche. Pourtant je fais bien comme la doc, mais ça ne fonctionne pas.

    La syntaxe indiquée est : require_auth [“INFORMATIQUE”, “COMPTA”] donc si un utilisateur fait partie du domaine INFORMATIQUE ou COMPTA, il doit pouvoir rentrer. Mais ce n’est pas le cas, je n’arrive pas à faire marcher ça.

    Est ce que d’autres ont le meme probleme ? Merci d’avance.

  2. Pierre Rigal sam, 10 fév 2007 22:39:46 CET

    Bonjour Zfred,

    De mémoire je n’ai pas eu ce problème mais j’avoue que cela fait un petit moment que je n’ai pas utiliser ce plugin… Je pense pas avoir testé de restreindre l’accès à 2 domaines différents, par contre comme je le disais dans mon article j’avais testé de restreindre l’accès à une interface d’admin à un domaine donné (‘administrators’) et cela avait bien marché.

    Désolé de pas pouvoir t’avancer mais peut être quelqu’un d’autre te répondra.

  3. Zfred lun, 12 fév 2007 10:28:47 CET

    Merci tout de meme pour ta réponse Pierre. En cherchant bien, en particulier sur le site de l’auteur, il y aurait un mini bug dans la fonction qui splitte l’argument, rendant le multi domaine impossible (dans le cas où l’on veuille faire un OU uniquement). La parade est assez simple, il faut se la faire soi meme. (En gros il faut écrire une mini méthode qui va tester l’appartenance au domaine 1, puis au 2…) Rien de bien grave, j’étais surtout inquiet de ne pas avoir les résultats annoncé dans le tuto. Bonne journée…

Comments (Syntaxe Markdown)