【问题标题】:Devise/LDAP - Save extra ldap attributes in db设计/LDAP - 在 db 中保存额外的 ldap 属性
【发布时间】:2011-10-27 08:41:36
【问题描述】:

我正在使用最新的 Devise 和 ldap 插件运行 rails 3.1。我已经交换了使用电子邮件地址的默认行为,现在使用 Novell eDir 中的 uid 属性作为我的用户字段。

我可以登录,我会根据根路由等重定向。

我现在正在努力的是从我的 ldap 中获取电子邮件和一个名为 category 的自定义属性并插入到数据库中。我试图让 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

我做错了什么?希望得到一些帮助!

最好的问候 //罗杰

【问题讨论】:

    标签: devise ldap ruby-on-rails-3.1 before-save


    【解决方案1】:

    我不确定它是否对你有帮助,但你可以这样使用它:

    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  
    

    当您的搜索获取的结果很少而不是一个并且您将获得 nil 值时,就会发生这种情况 这是一个总是将数组死返回到 ldap 自然的 hack: 在 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,比较补丁和原代码就明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多