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
总是返回结果数组,即使最终只匹配一个条目。 第一次打电话first
find匹配电子邮件地址的第一个(可能是唯一的)条目。 -
search返回的
Net::LDAP::Entry
方便您通过方法名访问属性,所以some_entry.displayName
与some_entry['displayName']
。 -
Net::LDAP::Entry
中的每个属性始终是值的数组,即使只有一个值存在。 尽pipe拥有多个“displayName”值的用户可能很愚蠢,但LDAP的通用性意味着这是可能的。 最后的first
调用将string数组转换为用户全名的string。
你有没有试过看这些:
http://saush.wordpress.com/2006/07/18/rubyrails-user-authentication-with-microsoft-active-directory/
http://xaop.com/blog/2008/06/17/simple-windows-active-directory-ldap-authentication-with-rails/
这比真实的答案更轶事
我有使用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