ActiveLdap y autenticación en Rails

Hola a todos,

Conocéis algún ejemplo de autenticación en Rails con ActiveLdap
(http://ruby-activeldap.rubyforge.org/doc/), que no sea el del wiki de
RubyOnRails(http://wiki.rubyonrails.org/rails/pages/HowtoAuthenticateViaLdap)

ActiveLdap me funciona: puedeo hacer búsquedas, y el mapping funciona
correctamente… pero el problema lo tengo a la hora de autenticar.

Cómo lo he hecho:

A) Me he creado el método authenticate en models/user.rb
El bind se hace a través del mismo usuario que autentica
Sé que no cierro la conexión (lo haré, pero ese no es el problema)

class User < ActiveLdap::Base
ldap_mapping :dn_attribute => “uid”,
:prefix => “ou=usuarios”

def self.authenticate(username, password)
ActiveLdap::Base.establish_connection(
:host => “ldap.ejemplo.es”,
:port => 389,
:base => “dc=ejemplo”,
:bind_dn => “uid=#{username},ou=usuarios,dc=ejemplo”,
:password_block => Proc.new { password },
:allow_anonymous => false)

  return true
rescue ActiveLdap::AuthenticationError
  return false
end

end

B) He creado lib/authenticated_ldap_system.rb, y lo he incluido en
controllers/application.rb (include AuthenticateLdapSystem)

module AuthenticateLdapSystem

protected

def is_logged_in?
@logged_in_user = User.find(:all,:attribute => ‘uid’, :value =>
session[:user]) if session[:user]
end

def logged_in_user
return @logged_in_user if is_logged_in?
end

def logged_in_user=(user)
if !user.nil?
session[:user] = user.uid <------------ AQUI FALLA
@logged_in_user = user
end
end

def self.included(base)
base.send :helper_method, :is_logged_in?, :logged_in_user
end

def login_required
unless is_logged_in?
flash[:error] = ‘Debe estar autenticado para realizar esta
acción.’
redirect_to :controller => ‘account’, :action => ‘login’
end
end

end

C) He creado controllers/login_controller.rb

class LoginController < ApplicationController

def logout
reset_session
flash[“alert”] = “Logged out”
redirect_to :action => “index”
end

def authenticate
self.logged_in_user = User.authenticate(params[:user][:username],
params[:user][:password])
if is_logged_in?
redirect_to index_url
else
flash[:error] = ‘Usuario/Password incorrecto.’
redirect_to :action => ‘login’
end
end

def logout
if request.post?
reset_session
flash[:notice] = ‘Acaba de dejar la zona segura.’
end
redirect_to index_url
end

end

D) He creado la correspondiente vista en views/login/

Login form

<% form_for :user, :url => {:action => 'authenticate'} do |f| -%>

Username:
<%= f.text_field :username, :size => 30 %>

Password:
<%= f.password_field :password, :size => 30 %>

<%= submit_tag 'Acceder' %> <% end -%>

Bueno… más que una duda parece un tutorial (si no fuese porque
falla :P)

El problema aparece cuando me intento autenticar:

Usuario: fulanito
Password: *******

El error

NoMethodError in LoginController#authenticate
undefined method `uid’ for true:TrueClass

Application Trace | Framework Trace | Full Trace
lib/authenticate_ldap_system.rb:15:in logged_in_user=' app/controllers/login_controller.rb:11:in authenticate’

La sensación que tengo es que lib/authenticate_ldap_system.rb no
entiende el mapeo de activeldap, por lo que ninguna de las propiedades
del objeto user le son conocidas. El espera un ActiveRecord.

No sé. Me he vuelto loco.

¿Se os ocurre algo?

Un saludo y gracias por adelantado!
Juanjo.

Hola otra vez,

Ok. No había leído el error con atención:

El error

NoMethodError in LoginController#authenticate
undefined method `uid’ for true:TrueClass

El método authenticate de models/user.rb no ha de devolver un booleano,
sino un objeto usuario.

Perdón.

Ya está resuelto más o menos.

Si metemos esta línea en el método authenticate, ya devolveríamos un
objeto User. Creo que no hace falta comprobar el password, pues para que
esta búsqueda funcione, el usuario ha tenido que meter previamente sus
creenciales, y con ellos hemos hecho el bind.

User.find(:first,:attribute => ‘uid’, :value => username)

¿Estáis de acuerdo?

Un saludo!

El mié, 16-01-2008 a las 23:19 +0100, juanjo escribió:

    :host => "ldap.ejemplo.es",


if !user.nil?
unless is_logged_in?

end

NoMethodError in LoginController#authenticate
La sensación que tengo es que lib/authenticate_ldap_system.rb no


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Juan José Vidal Agustín [email protected]
Universidad de Murcia
ÁTICA - Área de Tecnologías de la Información y las Comunicaciones
Aplicadas
Proyecto SOFTLA - Software Libre y Abierto Universidad de Murcia
Edificio Ática, Campus Univ. de Espinardo
E-30100 Murcia (SPAIN)

Tlf.: +34 968 39 8741

Hola,

¿Sabéis si se pueden hacer relaciones entre una clase ActiveRecord::Base
y una clase ActiveLdap::Base?

La idea no es otra que mapear los usuarios de un árbol LDAP, y que
tengan entradas en las base de datos, por ejemplo de recetas de cocina.

Algo así:

class User < ActiveLdap::Base
ldap_mapping :dn_attribute => “uid”,
:prefix => “ou=Usuarios”,

has_many :recetas

end

class Receta < ActiveRecord::Base
belongs_to :user
end

http://rubyforge.org/pipermail/ruby-activeldap-discuss/2006-December/000032.html
Leo aquí que no se puede… pero esto es de hace 1 año. Además, se os
ocurre alguna forma de hacerlo??? No me vale guardar los usuarios del
LDAP en otra tablas y “quedarmelos” en la base de datos… Lo único que
podría hacer sería una foreign_key desde recetas al uid (por ejemplo)

Un saludo!

El mié, 16-01-2008 a las 23:43 +0100, juanjo escribió:

Hola Juanjo, lo mio no es una solución, sino una duda. ¿Para que se usa
o
qué es ActiveLdap?
Con una brevísima descripción me valdría. Muchas gracias

Un saludo

El día 17/01/08, juanjo [email protected] escribió:

On 18/01/2008, Andrés gutiérrez [email protected] wrote:

Hola Juanjo, lo mio no es una solución, sino una duda. ¿Para que se usa o
qué es ActiveLdap?
Con una brevísima descripción me valdría. Muchas gracias

Hola Andrés,

(juro que no te estoy persiguiendo :wink:

Un pequeño fetiche mío es reservar la lista para dudas que no se
puedan resolver trivialmente con 5 segundos en Google. En concreto, 5
segundos en Google me han proporcionado esta respuesta a tu pregunta:

“Ruby/ActiveLdap provides an object oriented interface to LDAP. It
maps LDAP entries to Ruby objects with LDAP attribute accessors based
on your LDAP server’s schema and each object’s objectClasses. See
also: http://code.google.com/p/ruby-activeldap/

Y estoy seguro de que la Wikipedia tiene un buena artículo introductorio a
LDAP.

En todo caso, si después de haber consultado la introducción tuvieses
dudas concretas, este sería el sitio correcto para despejarlas.

Como regla general, el combo Google/Wikipedia contesta perfectamente
por lo general a preguntas del tipo “¿Qué es X?”, así que es mejor
acudir a él.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

On 18/01/2008, Andrés gutiérrez [email protected] wrote:

Ja ja :slight_smile: Vale. Soy un vago. De verdad que lo siento. A partir de ahora lo
haré como dices.

Gracias y espero que no me tengas que llamar más la atención en una buena
temporada

“Llamar la atención” suena mal. Yo lo dejaría en “orientar” xD

¡Buen viernes a todos!


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

Resumiéndolo todo, lo he puesto en la web:

Espero que os valga!

Un saludo!

El vie, 18-01-2008 a las 10:34 +0100, Manuel González Noriega escribió:

¡Buen viernes a todos!


Juan José Vidal Agustín [email protected]
Universidad de Murcia
ÁTICA - Área de Tecnologías de la Información y las Comunicaciones
Aplicadas
Proyecto SOFTLA - Software Libre y Abierto Universidad de Murcia
Edificio Ática, Campus Univ. de Espinardo
E-30100 Murcia (SPAIN)

Tlf.: +34 968 39 8741

Gracias

El día 25/01/08, juanjo [email protected] escribió:

Ja ja :slight_smile: Vale. Soy un vago. De verdad que lo siento. A partir de ahora
lo
haré como dices.

Gracias y espero que no me tengas que llamar más la atención en una
buena
temporada

El día 18/01/08, Manuel González Noriega
[email protected]
escribió: