LDAP通过Ruby或Rails

我一直在尝试将Rails应用程序挂接到ActiveDirectory。 我将同步AD和数据库之间的用户数据,目前MySQL(但可能会变成SQL Server或PostgreSQL)。

我已经检查了activedirectory-ruby,而且看起来真的很麻烦(对于1.0版本!)。 它包装了Net :: LDAP,所以我尝试使用它,但它确实接近LDAP的实际语法,我喜欢ActiveDirectory-Ruby的抽象,因为它的ActiveRecord类似的语法。

有没有一个优雅的ORMtypes的目录服务器的工具? 更好的是,如果有某种LDAP的脚手架工具(用户,组,单位等CRUD)。 然后,我可以通过Authlogic快速地将其与我现有的身份validation代码集成,并保持所有数据同步。

以下是我使用net-ldap gem在我的工作中validation来自ActiveDirectory服务器的用户login的示例代码:

require 'net/ldap' # gem install net-ldap def name_for_login( email, password ) email = email[/\A\w+/].downcase # Throw out the domain, if it was there email << "@mycompany.com" # I only check people in my company ldap = Net::LDAP.new( host: 'ldap.mycompany.com', # Thankfully this is a standard name auth: { method: :simple, email: email, password:password } ) if ldap.bind # Yay, the login credentials were valid! # Get the user's full name and return it ldap.search( base: "OU=Users,OU=Accounts,DC=mycompany,DC=com", filter: Net::LDAP::Filter.eq( "mail", email ), attributes: %w[ displayName ], return_result:true ).first.displayName.first end end 

最后的第一个first.displayName.first代码看起来有点愚蠢,所以可以从一些解释中获益:

  • Net::LDAP#search总是返回结果数组,即使最终只匹配一个条目。 第一次打电话firstfind匹配电子邮件地址的第一个(可能是唯一的)条目。

  • search返回的Net::LDAP::Entry方便您通过方法名访问属性,所以some_entry.displayNamesome_entry['displayName']

  • Net::LDAP::Entry中的每个属性始终是值的数组,即使只有一个值存在。 尽pipe拥有多个“displayName”值的用户可能很愚蠢,但LDAP的通用性意味着这是可能的。 最后的first调用将string数组转换为用户全名的string。

这比真实的答案更轶事

我有使用Samba和OpenLDAP服务器的相似经验。 我无法find一个图书馆真正做我想要的,所以我推出了我自己的帮手类。

我使用ldapbrowser来查看当我创build一个用户“官方”的方式,并基本上重复的Samba填充什么字段。

唯一棘手的/非标准的LDAP事情是疯狂的密码encryption,我们有:

为userpass:

 "{MD5}" + Base64.encode64(Digest::MD5.digest(pass)) 

sambaNTPassword:

 OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase 

对于def authenticate(user, pass)函数,我尝试让LDAP使用他们的凭证绑定到域,如果我发现exception,那么login失败,否则让他们进来。

我开始使用ruby-activedirectory,甚至扩展它/修复了一些东西,在Github上托pipejudy-active目录。

做下一个迭代,我发现ActiveLdap有更好的代码基础,我正在认真考虑切换到它。 有没有人有这方面的个人经验?

对不起,还不能评论…也许有人可以适当地重新定位。

@ Phrogz的解决scheme效果很好,但bind_simple(内部绑定)引发了一个Net :: LDAP :: LdapErrorexception,由于auth [:用户名]没有设置如下所示:

https://github.com/ruby-ldap/ruby-net-ldap/blob/master/lib/net/ldap.rb

更正的replace:

 auth: { method: :simple, email: email, password:password } 

有:

 auth: { method: :simple, username: email, password:password } 

你有没有检查出thinkbot的ldap-activerecord-gateway? 这可能是你要考虑的事情…

http://github.com/thoughtbot/ldap-activerecord-gateway/tree/master