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 %>
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.