2017年7月4日火曜日

LDAPをRubyから触る

# はじめに この記事は田胡研初夏のAdventCalendar2017 4日目の記事です. 今日はRubyでLDAPの認証を利用したりしたときの話とちょっとしたサンプルコードを晒します. # RubyでLDAPを使うとき RubyでLDAPを使う際便利なGemはいくつかあります. * ruby-ldap (http://ruby-ldap.sourceforge.net/) * net-ldap ( https://github.com/ruby-ldap/ruby-net-ldap ) * active-ldap ( https://github.com/activeldap/activeldap ) などです. この内どれを使うか悩んだのですがnet-ldapを使うことにしました. 理由としては * なんか一番情報が多かった( コードサンプルとか ) * LDAPの問い合わせ操作がLDAPに近くLDAPを触るようにRuby上のコードがかける ことです. まず先にどんな感じで書けばLDAPの情報が引けるのか示します. # 単純にログインチェック net-ldapはgemで公開されているのでGemfileに書いて持ってきます. そしてこんな感じのコードを書きます. ```ruby require 'net/ldap' ldap = Net::LDAP.new ldap.host = LDAP_SERVER_HOST ldap.port = LDAP_PORT # アクセスのベースディレクトリを指定 ldap.base = LDAP_BASE # ログインするldapidとpassword username = params[:username] password = params[:password] # LDAP上での名前に luname = "uid=#{username},LDAP_BASE" ldap.auth luname, password # このbindがtrueならログインできる, falseはログインできない. ldap.bind ``` 思ったより複雑ではなかったです, ライブラリ様様ですね. # ユーザの属性取得 ログイン試行のコード例はいろいろあるのですがそれ以外があまり情報がなく少し手間取りました. ユーザの属性取得はFilterを利用してこんな感じ. ```ruby # 前述コードのldap.authのあとから ldap.open do |conn| filter = Net::LDAP::Filter.eq('uid', username) @entry = conn.search(filter: filter).first end # @entryはMapで回すと属性が取れる. @entry do |key, value| p key p value end ``` LDAPのクエリを少し調べないといけないのですがLDAPのクエリのサンプルはそこそこ転がっていて,それをRuby上のコードにするのは簡単でした. あるユーザの所属するグループ一覧を出すクエリなどは実現方法がわからずLDAPのデータを引いてきたあとにRuby側でフィルタするということを行って実現しました. # 田胡研のLDAPサーバのラッパーAPI ここまで示したようなコードを使ってLDAPのクエリを書いていけばRubyからLDAPの情報を引いてくることができます. ただLDAP自体メジャーな技術ではなかったり触るのが少し癖があったりで皆が手軽に利用するのは大変なので, 田胡研では今回書いたような方法でLDAPにアクセスし認証を行ったり,LDAPの情報をJSONで返す(WebAPI)を用意しています. APIでは以下の情報が取得できます. * ログイン試行 (userid+password or token) * 自分の情報 * 自分の所属するグループのリスト * 任意の人の情報(セキュアなものはないので弊研のLDAPはログインさえできれば他人の属性も引けます) このAPIを利用しいくつかのサービスを田胡研では開発しています. ( 田胡研メンバでLDAP認証系利用したいような人がいればswagger-doc等のリンクはnamazuさんのwiki個人ページにあるので参照してください. )

0 件のコメント:

コメントを投稿