Devise ? c'est bien, mais il faut le tester.

Alors que j'ai évoqué ma migration de Merb à Rails pour Oupsnow, il a fallu trouver un système d'authentification ORM Agnostique.

Le plugin d'authentification le plus connu à l'heure actuel est Authlogic. Ce plugin est vraiment très performant, mais tous les essais de le rendre ORM Agnostique ont été vain. C'est alors qu'au même moment, durant le Rails Summit 2009, George Guimarães et Carlos Antonio annoncent la sortie de Devise, un plugin Rails au dessus de Warden ( Rack middleware d'authentification). C'est exactement, ce qu'il me faut, un nouveau système d'authentification a tester et peut-être une possibilité d'ajouter une couche d'ORM Agnostique dedans. En plus Warden étant un RackMiddleware, je pourrais un peu tester ce que ça donne.

J'installe donc Devise et commence à l'utiliser dans Oupsnow. Tout se passe à merveille, jusqu'au moment où il faut faire les tests. Tout de suite le bât blesse. Les tests controlleurs de Rails ne communiquent pas avec la couche Rack qui n'est pas initialisée. On se retrouve donc avec une impossibilité de définir si un utilisateur est loggé ou non et si oui, qui est cet utilisateur.

Après de nombreux tests et essais. J'ai fini par trouver comment faire. Warden ajoute à la requête une variable d'environment dans la requête. On peux y accéder par request.env['warden']. Il suffit donc de remplir cette variable.

Pour avoir un utilisateur non loggé, il faut faire :

def unlogged
  request.env['warden'] = Warden::Proxy.new(request.env, {:default_strategies => [:rememberable, :authenticable],:silence_missing_strategies => true})
end

Pour se logger avec un utilisateur en particulier il faut faire :

def logged_as(user)
  proxy = Warden::Proxy.new(request.env, {:default_strategies => [:rememberable, :authenticable], :silence_missing_strategies => true})
  proxy.set_user(user, :store => true, :scope => :user)
  request.env['warden'] = proxy
end

Personnellement, j'aime beaucoup devise. A tel point que j'ai permis de le rendre ORM Agnostique et compatible avec MongoMapper.

EDIT du 30 Novembre 2009: la technique indiquée ici n'est pas optimum et ne marche pas avec les dernières versions de Devise. utilisez plutôt la technique décrite dans mon ticket Comment tester devise ? réélement ?

[...]
Published on Jeu 19 nov 2009 22:36
0 commentaires

Créer une authentification HTTP avec Nginx

Voici comment réaliser simplement une authentification HTTP avec Nginx. Pour cela, il suffit d'utiliser le module d'authentification basic. Pour l'utiliser c'est très simple. Il suffit d'ajouter dans votre niveau d'url, les directives suivantes :

  • auth_basic : qui permet de définir qu'il y a une authentification HTTP si il n'y a pas "off". Le texte ainsi donnée à cette directive sera affiché pour informer l'utilisateur que l'url contactée est sécurisée par HTTP.
  • auth_basic_user_file : donne un chemin de fichier contenant la liste des utilisateurs ayant accès à l'url avec leur mot de passe. Les mots de passes peuvent ainsi être écrit en clair ou de la même façon qu'Apache avec crypt(3). Ainsi vous pouvez directement utiliser vos anciens fichiers Apache, ce qui est très pratique.

Voici donc un exemple pour mettre une authentification HTTP sur un Vhost :

server {
  auth_basic "Ce serveur nécessite une authentification";
  auth_basic_user_file conf/httpassword;
}

Exemple pour mettre une authentification HTTP sur une url :

server {
  location /admin {
    auth_basic "Cette partie nécessite une authentification";
    auth_basic_user_file conf/httpassword;
  }
}

Exemple de fichier de gestion des utilisateurs :

# Les commentaires
user:pass
user2:pass2:commentaires
user3:pass3
[...]
Published on Lun 01 oct 2007 14:10
0 commentaires

RSS Follow me on Twitter