Auth_generator : un autre système de login.
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.
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.
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.
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…