[Ror-es] ActiveLdap y autenticación en Rails
juanjo
juanjova at um.es
Wed Jan 16 22:43:29 GMT 2008
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ó:
> 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/
> ----------------------------------------------------------------------------
> <h1>Login form</h1>
> <% form_for :user, :url => {:action => 'authenticate'} do |f| -%>
> <p>Username: <br/><%= f.text_field :username, :size => 30 %></p>
> <p>Password: <br/><%= f.password_field :password, :size => 30 %></p>
> <%= 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.
>
> _______________________________________________
> Ror-es mailing list
> Ror-es at lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
--
____________________________________________________________________________
Juan José Vidal Agustín <juanjova at um.es>
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
===================================================================
More information about the Ror-es
mailing list