BETA

Devise を使って Active Directory から情報を取得する方法

投稿日:2019-09-27
最終更新:2019-09-27

今回は以前書いた Devise を使って Active Directory 認証を実装する の続きです。

前回はActive Directory(AD)に登録されたユーザーで、ログインできるところまで実装しました。
認証だけならこれでいいのですが、実際は AD に登録されている氏名やメールアドレスをとってきたりすると思います。
今回はそうした関連情報の取得をやってみたいと思います。

なお、今回のリポジトリはこちらです

前提

今回は以下のユーザーを AD 上に作成して、AD に登録されている情報を取得したいと思います。

ユーザー名: test_taro
姓: テスト
名: 太郎
電話番号: 070-1234-5678
役職: 係長
メールアドレス: [email protected]
社員番号: 00123

また、AD 上でのそれぞれの項目の属性名は以下のとおりです。

ユーザー名: sAMAccountName
姓: sn
名: givenName
電話番号: telephoneNumber
役職: title
メールアドレス: mail
社員番号: employeeID

マイグレーションファイルの作成とマイグレート

AD のユーザーでログインできるようになった前回の続きから、という体で書いていきたいと思います。
まずは、それぞれの項目を User テーブルに格納できるように、カラムを追加します。

$ bundle exec rails g migration AddColumnToUser last_name:string first_name:string phone_number:string title:string mail:string employee_number:string  
Running via Spring preloader in process 42345  
      invoke  active_record  
      create    db/migrate/2019MMDDhhmmss_add_column_to_user.rb  

こんな感じのマイグレーションファイルが作成されます。

class AddColumnToUser < ActiveRecord::Migration[5.2]  
  def change  
    add_column :users, :last_name, :string  
    add_column :users, :first_name, :string  
    add_column :users, :phone_number, :string  
    add_column :users, :title, :string  
    add_column :users, :mail, :string  
    add_column :users, :employee_number, :string  
  end  
end  

マイグレートします。

$ bundle exec rails db:migrate  
== 20190926141900 AddColumnToUser: migrating ==================================  
-- add_column(:users, :last_name, :string)  
   -> 0.0020s  
-- add_column(:users, :first_name, :string)  
   -> 0.0006s  
-- add_column(:users, :phone_number, :string)  
   -> 0.0005s  
-- add_column(:users, :title, :string)  
   -> 0.0004s  
-- add_column(:users, :mail, :string)  
   -> 0.0003s  
-- add_column(:users, :emaployee_number, :string)  
   -> 0.0004s  
== 20190926141900 AddColumnToUser: migrated (0.0049s) =========================  

各種情報を取得する

各種情報の取得は User モデルにコールバックとして実装します。

class User < ApplicationRecord  
  before_save :get_last_name, :get_first_name, :get_phone_number, :get_title, :get_mail, :get_emplpyee_number  
  devise :ldap_authenticatable, :rememberable, :trackable  

  private  

  def get_last_name  
    last_name = Devise::LDAP::Adapter.get_ldap_param(username, 'sn')  
    self.last_name = last_name.first.force_encoding('UTF-8') unless last_name.nil?  
  end  

  def get_first_name  
    first_name = Devise::LDAP::Adapter.get_ldap_param(username, 'givenName')  
    self.first_name = first_name.first.force_encoding('UTF-8') unless first_name.nil?  
  end  

  def get_phone_number  
    phone_number = Devise::LDAP::Adapter.get_ldap_param(username, 'telephoneNumber')  
    self.phone_number = phone_number.first.to_s unless phone_number.nil?  
  end  

  def get_title  
    title = Devise::LDAP::Adapter.get_ldap_param(username, 'title')  
    self.title = title.first.force_encoding('UTF-8') unless title.nil?  
  end  

  def get_mail  
    mail = Devise::LDAP::Adapter.get_ldap_param(username, 'mail')  
    self.mail = mail.first.to_s unless mail.nil?  
  end  

  def get_emplpyee_number  
    employee_number = Devise::LDAP::Adapter.get_ldap_param(username, 'employeeID')  
    self.employee_number = employee_number.first.to_s unless employee_number.nil?  
  end  
end  

日本語の値を取得する処理についてはこちらの記事を参考にさせていただきました。
ActiveDirectoryの日本語ユーザ名(DisplayName)をRailsのDeviseで扱う
ありがとうございました。

一旦この状態で、bundle exec rails server をして、Rails アプリを起動します。
起動後に test_taro でログインして、正常にログインしたら、Rails のコンソールからレコードを確認します。

irb(main):001:0> User.first  
  User Load (1.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]  
=> #<User id: 1, username: "test_taro", created_at: "2019-09-26 14:52:03", updated_at: "2019-09-26 15:02:45", last_name: "テスト", first_name: "太郎", phone_number: "070-1234-5678", title: "係長", mail: "[email protected]", employee_number: "00123">  

きちんと AD に登録した情報が取れていました。

ビューの編集

あとは、ビューで表示してあげるだけですね。ログイン後にリダイレクトされる home 画面で表示したいと思います。

<h1>StaticPages#home</h1>  
<p>Find me in app/views/static_pages/home.html.erb</p>  
<p>Welcome <%= current_user.username %> !</p>  

<li>ユーザー名: <%= current_user.username %></li>  
<li>姓: <%= current_user.last_name %></li>  
<li>名: <%= current_user.first_name %></li>  
<li>電話番号: <%= current_user.phone_number %></li>  
<li>役職: <%= current_user.title %></li>  
<li>メールアドレス: <%= current_user.mail %></li>  
<li>社員番号: <%= current_user.employee_number %></li>  
<%= link_to  "ログアウト", destroy_user_session_path %>  

うまく表示されました。

まとめ

AD には様々な情報が登録されていますが、devise_ldap_authenticatable を使って比較的かんたんに情報を取得できると思います。
まだ試せてはいませんが、devise_ldap_authenticatable では、Rails アプリでパスワードを変更し、変更したパスワードを AD 側に書き戻すこともできるようなので、こちらにもトライしてみたいと思います。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@toyocyの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!