Я бегу:
Ruby 1.9.3p0,
Рельсы 3.1.1,
Разработать 1.4.9,
Devise_ldap_authenticatable 0.4.10
Я использую Devise для аутентификации моего Rails-приложения через ldap-сервер. Я использую имя пользователя вместо электронной почты для аутентификации, поэтому, естественно, поле электронной почты в моей таблице пустое.
Чтобы запросить ldap по электронной почте, официальным способом является добавление этого кода в модель пользователя:
before_save :get_ldap_email
def get_ldap_email
self.email = Devise::LdapAdapter.get_ldap_param(self.username,"mail")
end
Этот код завершается ошибкой, без попытки что-либо сделать с ldap, с этим:
undefined method `mail' for nil:NilClass
Относится к строке внутри определения метода. Вывод журнала больше не полезен:
Started POST "/users/sign_in" for 10.50.1.96 at 2011-11-15 11:18:16 -0800
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"<hidden>=", "user"=>{"username"=>"<hidden>", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."username" = '<hidden>' LIMIT 1
LDAP: LDAP dn lookup: uid=<hidden>
LDAP: LDAP search for login: uid=<hidden>
LDAP: Authorizing user <hidden>
LDAP: LDAP dn lookup: uid=<hidden>
LDAP: LDAP search for login: <hidden>
Completed 500 Internal Server Error in 251ms
NoMethodError (undefined method `mail' for nil:NilClass):
app/models/user.rb:14:in `get_ldap_email'
Все строки, предшествующие ошибке 500, являются обычной успешной аутентификацией LDAP, не связанной с запросом электронной почты.
Я начал изучать Ruby, Rails и Devise только на прошлой неделе, поэтому я не уверен, какие файлы будут наиболее интересными, но вот моя модель user.rb и gemfile:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :ldap_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
before_save :get_ldap_email
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :username, :password, :password_confirmation, :remember_me
def get_ldap_email
self.email = Devise::LdapAdapter.get_ldap_param(self.username,"mail")
end
end
И гемфайл:
source 'http://rubygems.org'
gem 'rails', '3.1.1'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'sqlite3'
<... unrelated ...>
gem 'therubyracer', :platforms => :ruby
gem "devise"
gem "devise_ldap_authenticatable"
Я попытался перезапустить сервер и установил пакет после последнего обновления GemFile. В моей конфигурации ldap_create_user = true, а username - это правильное имя поля у пользователей. Есть ли ошибка в этом методе? Может ли быть несовместимость версий? Я не совсем уверен, что еще нужно проверить, и рельсы не дают мне ничего нового для начинающих. Я хотел бы помочь с этим.