Rails rails 中实现 windows 集成认证

carl · February 12, 2012 · Last by lyfi2003 replied at February 12, 2012 · 4082 hits

如题,rails 中可以实现 windows 集成认证吗(windows 环境下)?大家有研究过的吗?如果一个 rails 项目想实现 windows 集成认证,要怎么做呢?谢谢!

或者说 rail 中怎么做 LDAP 集成认证呢?

用 ruby-ldap 这个 gem

然后,大概的代码如下,然后就跟密码认证差不多了:

require 'ldap'

conn = LDAP::Conn.new( '<domain-server>', 389 )
conn.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )
conn.bind( '<domain>\<username>', '<password>' ) do |conn|

base = 'ou=Users,ou=<container>,dc=<domain>,dc=local'

results = conn.search2(base, LDAP::LDAP_SCOPE_SUBTREE, '(cn=*)')
results.each { |entry| puts "#{entry['dn']}: #{entry['telephoneNumber']}" }

end

或者用这个 gem: net-ldap 参考: http://stackoverflow.com/questions/3539501/rails-ldap-login-using-net-ldap

#1 楼 @lyfi2003 就是说还是需要用户输入账号密码的?然后这个账号密码传到我们服务器的后台再与 LDAP 做验证?我想要的是那种类似于 windows 集成认证的,就是在一个公司的网络环境中,大家可以通过集成认证访问我们的网站,但是我们的网站不会得到用户的任何信息,尤其是密码?是这种吗?谢谢!

Rails 肯定要知道相关密码 (也许是加密后的),然后传给 LDAP 作认证,通过了 rails 就可以认为 OK 了,创建好 session 的登录信息就可以了。 可以参考以下的 model:( 来自 stackoverflow )

require 'net/ldap'

class User < ActiveRecord::Base

  def after_initialize
    @config = YAML.load(ERB.new(File.read("#{Rails.root}/config/ldap.yml")).result)[Rails.env]
  end

  def ldap_auth(user, pass)
    ldap = initialize_ldap_con
    result = ldap.bind_as(
      :base => @config['base_dn'],
      :filter => "(#{@config['attributes']['id']}=#{user})",
      :password => pass
    )
    if result
      # fetch user DN
      get_user_dn user
      sync_ldap_with_db user
    end
    nil
  end

  private
  def initialize_ldap_con
    options = { :host => @config['host'],
                :port => @config['port'],
                :encryption => (@config['tls'] ? :simple_tls : nil),
                :auth => { 
                  :method => :simple,
                  :username => @config['ldap_user'],
                  :password => @config['ldap_password']
                }
              }
    Net::LDAP.new options
  end

  def get_user_dn(user)
    ldap = initialize_ldap_con
    login_filter = Net::LDAP::Filter.eq @config['attributes']['id'], "#{user}"
    object_filter = Net::LDAP::Filter.eq "objectClass", "*" 

    ldap.search :base => @config['base_dn'],
                :filter => object_filter & login_filter,
                :attributes => ['dn', @config['attributes']['first_name'], @config['attributes']['last_name'], @config['attributes']['mail']] do |entry|
      logger.debug "DN: #{entry.dn}"
      entry.each do |attr, values|
        values.each do |value|
          logger.debug "#{attr} = #{value}"
        end
      end
    end
  end
end

#3 楼 @lyfi2003 哦,明白。那 ruby on rails 可以实现 windows AD 认证吗?windows AD 认证和这个有区别吗?也必须要我们程序的后台知道账号、密码然后去做验证?没有那种类似于 OAuth 认证的,可以不用告诉我们密码然后自己去做认证的?

从原理上讲是必须要知道的,因为 rails 只是一 web 表现层,无法获取 ntlm 认证信息。而且必须能够查询到 AD. 除非除非你设计一个浏览器插件,用来获取本地的认证域信息。

You need to Sign in before reply, if you don't have an account, please Sign up first.