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")
-
前の記事
React.js ライブラリ「react-likert-scale」を使って リッカート尺度を実装する 2021.03.24
-
次の記事
javascript テーブルをソート及び検索する 2021.03.24
コメントを書く