通过 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.displayNamesome_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 开发以太坊的应用

ruby Rails 4/5通过资产预编译测试加速

Ruby-on-Rails:多个 has_many :通过可能吗?

ruby 通过Rails中的ajax / javascript文件下载

Ruby on rails 协会 - 用户(设计)在注册和登录后可以“创建团队”或“加入团队”