通过 Ruby 或 Rails 的 LDAP
Posted
技术标签:
【中文标题】通过 Ruby 或 Rails 的 LDAP【英文标题】:LDAP through Ruby or Rails 【发布时间】:2010-09-24 23:20:55 【问题描述】:我一直在尝试将 Rails 应用程序连接到 ActiveDirectory。我将在 AD 和数据库之间同步有关用户的数据,目前是 mysql(但可能会变成 SQL Server 或 PostgreSQL)。
我检查了 activedirectory-ruby,它看起来确实有问题(对于 1.0 版本!?)。它包装了 Net::LDAP,所以我尝试使用它,但它非常接近 LDAP 的实际语法,而且我喜欢 ActiveDirectory-Ruby 的抽象,因为它的语法类似于 ActiveRecord。
是否有一个优雅的 ORM 类型的目录服务器工具?更好的是,如果有某种用于 LDAP 的脚手架工具(用于用户、组、组织单位等的 CRUD)。然后我可以通过 Authlogic 快速将其与我现有的身份验证代码集成,并保持所有数据同步。
【问题讨论】:
【参考方案1】:您是否尝试过查看这些:
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/
【讨论】:
mrT - 许多可能曾经在您的答案中起作用的链接现在都已损坏。你能被说服更新它们吗?提前致谢。 新的如何使用 ldap 链接进行身份验证:wiki.rubyonrails.org/rails/pages/…【参考方案2】:对不起,还不能评论...也许有人可以适当地重新定位。
@Phrogz 的解决方案运行良好,但由于未设置 auth[:username],bind_simple(内部绑定)引发 Net::LDAP::LdapError 异常,如下所示:
https://github.com/ruby-ldap/ruby-net-ldap/blob/master/lib/net/ldap.rb
更正的替换:
auth: method: :simple, email: email, password:password
与:
auth: method: :simple, username: email, password:password
【讨论】:
顺便说一句,您可以编辑其他人的帖子——编辑将进入建议编辑队列,两个人可以确认或否认编辑是好的。 :)【参考方案3】:这是我在工作中使用net-ldap gem 来验证来自 ActiveDirectory 服务器的用户登录的示例代码:
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
的第一次调用会找到与电子邮件地址匹配的第一个(并且可能是唯一的)条目。
搜索返回的Net::LDAP::Entry
方便你通过方法名访问属性,所以some_entry.displayName
和some_entry['displayName']
是一样的。
Net::LDAP::Entry
中的每个属性始终是一组值,即使只存在一个值也是如此。尽管让用户具有多个“displayName”值可能很愚蠢,但 LDAP 的通用性意味着它是可能的。最后的first
调用将单字符串数组转换为用户全名的字符串。
【讨论】:
感谢您迟到的答复。我几乎不再需要这些信息了,但是这种语法看起来很棒,而且比我尝试做的方式要短得多。再次感谢! 感谢您发布此信息。我一直碰壁只是因为我没有将@company.com 包含在用户名中。你的帖子让我朝着正确的方向前进。【参考方案4】:我开始使用 ruby-activedirectory,甚至扩展/修复了一些东西,在 Github 中托管 judy-activedirectory。
在进行下一次迭代时,我发现 ActiveLdap 的代码库要好得多,我正在认真考虑改用它。有没有人有这方面的亲身经历?
【讨论】:
【参考方案5】:这比真实的答案更像是轶事......
我在使用 Samba 和 OpenLDAP 服务器时也有过类似的经历。我找不到真正做我想做的事的库,所以我推出了自己的帮助类。
我使用ldapbrowser 来查看当我以“官方”方式创建用户时 Samba 填写了哪些字段,并且基本上复制了该字段。
唯一棘手/非标准的 LDAP 是我们拥有的疯狂密码加密:
用户密码:
"MD5" + Base64.encode64(Digest::MD5.digest(pass))
sambaNT密码:
OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase
对于def authenticate(user, pass)
函数,我尝试让 LDAP 使用他们的凭据绑定到域,如果我发现异常则登录失败,否则让他们进入。
【讨论】:
+1 谢谢,我正在寻找一种在 ruby 中生成 nt 密码哈希的方法 :)【参考方案6】:你检查过thoughtbot 的ldap-activerecord-gateway 吗?这可能是你需要考虑的事情......
http://github.com/thoughtbot/ldap-activerecord-gateway/tree/master
【讨论】:
嗯。我仍在试图了解这可以为我们做什么。本质上,我会在启动 rails 应用程序时启动这个 ldap 服务器。然后,如果有办法在此服务器和真正的 AD 服务器之间复制数据,请执行此操作。然后使用我的 ldap 服务器获取数据。这有意义吗?以上是关于通过 Ruby 或 Rails 的 LDAP的主要内容,如果未能解决你的问题,请参考以下文章
gitlab 11.2.3 通过LDAP 调用FreeIPA 登录
Ruby-on-Rails:多个 has_many :通过可能吗?