Devise / LDAP - Сохранить дополнительные атрибуты ldap в БД - PullRequest
0 голосов
/ 27 октября 2011

Я использую rails 3.1 с последним плагином Devise и ldap.Я изменил поведение по умолчанию при использовании адреса электронной почты и теперь использую атрибут uid в Novell eDir в качестве моего поля пользователя.

Я могу войти в систему, меня перенаправляют на основе корневого маршрута и т. Д.

ЧтоЯ сейчас борюсь с тем, чтобы получить электронную почту и пользовательский атрибут с именем category из моего ldap и вставить в базу данных.Я пытаюсь заставить работать before_save.

class User < ActiveRecord::Base

    before_save :get_ldap_email
    before_save :get_ldap_category

    # Include default devise modules. Others available are:
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and  :omniauthable
    devise :ldap_authenticatable, :rememberable, :trackable

    # Setup accessible (or protected) attributes for your model
    attr_accessible :uid, :category, :email, :password, :password_confirmation, :remember_me

    def get_ldap_email
        self.email = Devise::LdapAdapter.get_ldap_param(self.uid, "mail")
    end

    def get_ldap_category
        self.category = Devise::LdapAdapter.get_ldap_param(self.uid, "category")
    end

end

Возможно, я тупой, но я не могу заставить это работать.При входе в систему я получаю следующий вывод:

NoMethodError in Devise::SessionsController#create

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
Rails.root: /home/ntr/Dropbox/source/devise

Application Trace | Framework Trace | Full Trace
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"jljpH9bUXrPeBVy4jKnJoAfeuO/EiF0YxRqxm07VF5w=",
 "user"=>{"uid"=>"ntr",
 "password"=>"[FILTERED]",
 "remember_me"=>"0"},
 "commit"=>"Logga in"}
Show session dump

Show env dump

Response

Headers:

None

Что я делаю не так?Хотелось бы получить помощь с этим!

С уважением // Роджер

1 Ответ

2 голосов
/ 08 февраля 2012

Я не уверен, что это поможет вам, но вы можете использовать это так:

self.firstname = Devise::LdapAdapter.get_ldap_param(self.username, 'givenName').first
self.lastname = Devise::LdapAdapter.get_ldap_param(self.username, 'sn').first    
self.email = Devise::LdapAdapter.get_ldap_param(self.username, 'mail').first  

Это происходит, когда ваш поиск выбирает несколько результатов вместо одного, и вы получите ноль Valuse Вот хак, который всегда возвращает массив die к природе ldap: В файле config / initializer / devise.rb добавьте следующий патч:

module Devise
  module LdapAdapter
    class LdapConnect
      def ldap_param_value(param)
        filter = Net::LDAP::Filter.eq(@attribute.to_s, @login.to_s)
        ldap_entry = nil
        @ldap.search(:filter => filter) {|entry| ldap_entry = entry}

        if ldap_entry 
          if ldap_entry[param]
            DeviseLdapAuthenticatable::Logger.send("Requested param #{param} has value #{ldap_entry.send(param)}")
            value = ldap_entry.send(param)           
          else
            DeviseLdapAuthenticatable::Logger.send("Requested param #{param} does not exist")
            #changes here
            value = nil
          end
        else
          DeviseLdapAuthenticatable::Logger.send("Requested ldap entry does not exist")
          value = nil
        end
      end
    end
  end
end

Посмотрите больше на https://github.com/cschiewek/devise_ldap_authenticatable/issues/69 и сравните патч с оригинальным кодом, чтобы понять.

...