Please give example of Rails/Devise/LDAP Devise::L

2019-07-19 09:48发布

问题:

I am stuck using get_ldap_param authenticating against an eDir ldap server. I can authenticate but when I try to read attributes I get nothing.

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

In my ndstrace.log

92659520 LDAP: [2011/11/14 10:10:07.401] New cleartext connection 0xe4b26c0 from     192.168.21.40:58658, monitor = 0x4b37c940, index = 8
1256683840 LDAP: [2011/11/14 10:10:07.401] DoBind on connection 0xe4b26c0
1256683840 LDAP: [2011/11/14 10:10:07.401] Bind name:cn=admin,o=xxx, version:3, authentication:simple
1256683840 LDAP: [2011/11/14 10:10:07.401] Sending operation result 0:"":"" to connection 0xe4b26c0
1310226752 LDAP: [2011/11/14 10:10:07.402] DoSearch on connection 0xe4b26c0
1310226752 LDAP: [2011/11/14 10:10:07.402] Search request:
base: "cn=ntr,ou=Meta,o=xxx"
scope:0  dereference:0  sizelimit:0  timelimit:0  attrsonly:0
filter: "(objectclass=*)"
no attributes
1310226752 LDAP: [2011/11/14 10:10:07.402] Empty attribute list implies all user attributes
1310226752 LDAP: [2011/11/14 10:10:07.403] Sending search result entry "cn=ntr,ou=Meta,o=xxx" to connection 0xe4b26c0
1310226752 LDAP: [2011/11/14 10:10:07.403] Sending operation result 0:"":"" to connection 0xe4b26c0
1261947200 LDAP: [2011/11/14 10:10:07.405] Monitor 0x4b37c940 found connection 0xe4b26c0 socket closed, err = -5871, 0 of 0 bytes read
1261947200 LDAP: [2011/11/14 10:10:07.405] Monitor 0x4b37c940 initiating close for connection 0xe4b26c0
1251420480 LDAP: [2011/11/14 10:10:07.405] Server closing connection 0xe4b26c0, socket error = -5871
1251420480 LDAP: [2011/11/14 10:10:07.405] Connection 0xe4b26c0 closed

The error I get after logging in:

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"=>"nkuzPnh8MCK4rh/RXUErrAjVJB9ciy56hfavG60I8ck=",
 "user"=>{"uid"=>"ntr",
 "password"=>"[FILTERED]",
 "remember_me"=>"0"},
 "commit"=>"Logga in"}
Show session dump

Show env dump

Response

Headers:

None

I've been searching high and low for some kind of tutorials for this on the web but only found basic implementations of the devise_ldap addon. Non using get_ldap_param.

Would love to get some examples, tips etc.

//Roger

回答1:

The dstrace is showing that you are getting all the attributes returned:

Empty attribute list implies all user attributes

But it does not show the returned data in dstrace anymore. Older eDirectory at one point did show the results in trace but not for a long time now.

So I would suggest eDir is sending the data back. Now on to how your app is parsing that response.



回答2:

The problem, in part, is that currently, devise_ldap_authenticatable gem does not pass in an authentication password to this function.

https://github.com/cschiewek/devise_ldap_authenticatable/issues

I wish there was a callback where one could extra more out of the LDAP response from authentication, but that doesn't seem possible.