rails6 LDAPで取得したデータを表示する

rails6 LDAPで取得したデータを表示する

rails6でLDAPで取得したデータを表示するまでの手順を記述してます。Railsのバージョンは6.1.3を使用してます。

環境

  • OS CentOS Linux release 7.9.2009 (Core)
  • Ruby 3.0.0
  • Rails 6.1.3

net-ldapインストール

まずは、LDAP通信を行うために、「net-ldap」というgemをインストールします。

Gemfileに以下を追加します。

gem "net-ldap"

インストールします。

bundle install

controller作成

excelを読み込むための「excel_import」というcontrollerを作成します。

rails g controller ldap

<出力結果>
Running via Spring preloader in process 110803
      create  app/controllers/ldap_controller.rb
      invoke  erb
      create    app/views/ldap
      invoke  test_unit
      create    test/controllers/ldap_controller_test.rb
      invoke  helper
      create    app/helpers/ldap_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/ldap.scss

controller内でEXCEL「Book1.xlsx」を読み込みます

ここでは「active directory」は以下の構成になっているものとしてます。

  • サーバー : 192.168.1.100
  • ドメイン : hoge.local
  • adminのパスワード : password
  • OU : ou-keiri
class LdapController < ApplicationController
  def index
    require "net/ldap"

    @ldap = Net::LDAP.new :host => "192.168.1.100",
                          :port => 389,
                          :auth => {
                            :method => :simple,
                            :username => "cn=administrator, cn=users, dc=hoge, dc=local",
                            :password => "password",
                          }

    if @ldap.bind
      logger.debug("成功")
    else
      logger.debug("失敗")
    end

  # sAMAccountNameが「001」のもののみ取得
    @filter = Net::LDAP::Filter.eq("sAMAccountName", "001")
    @treebase = "ou=ou-keiri,dc=hoge,dc=local"

    # デバック用
  @ldap.search(:base => @treebase, :filter => @filter) do |entry|
      entry.each do |attribute, values|
        logger.debug("attribute = #{attribute}")
        values.each do |value|
          logger.debug("value = #{value.force_encoding("UTF-8")}")
        end
      end
    end
  end
end

View作成

次に表示するためのviewを作成します。

「ldap」配下に「index.html.erb」を作成して、以下の内容で編集します。

<% @ldap.search(:base => @treebase, :filter => @filter) do |entry| %>
    <% entry.each do |attribute, values| %>
        attribute = <%= attribute %><br>
        <% values.each do |value| %>
            value = <%= value.force_encoding("UTF-8") %><br>
        <% end %>
    <% end %>
<% end %>

route作成

最後にルーティングを設定します。

get "ldap", to: "ldap#index"

内容確認

railsを起動してブラウザから http://プライベートIP or サーバーアドレス/ldap:3000 にアクセスします。

rails s

表示結果

複数filter作成

複数のfilterを作成する場合は、以下のようにします。

# controller
@filter1 = Net::LDAP::Filter.eq("objectClass", "user")
@filter2 = Net::LDAP::Filter.eq("sAMAccountName", "hoge")


# view
<% @ldap.search(:base => @treebase, :filter => @filter1 & @filter2) do |entry| %>

取得したい属性を設定

if文を利用して取得します。

<% @ldap.search(:base => @treebase, :filter => @filter1 & @filter2) do |entry| %>
    <% entry.each do |attribute, values| %>
        
        <% if attribute.to_s === "cn" || attribute.to_s === "displayname" || attribute.to_s === "mail" %>
            <% values.each do |value| %>
                <%= value.force_encoding("UTF-8") %><br>
            <% end %>
        <% end %>

    <% end %>
<% end %>

lastlogonなど、windowsタイムを使用している場合は、一度unixtimeに変換してから使用します。

Time.at(value.force_encoding("UTF-8").to_i / 10000000 - 11644473600).strftime("%Y/%m/%d %H:%M:%S")