web2py version: 1.99.4

2.2.6. LDAP認証

LDAP を使った認証方式です。

Note

LDAP(Lightweight Directory Access Protocol)とは、ディレクトリサービスに接続するプロトコルのことです。

なお LDAP はソケット(socket)を使用しますので、Google AppEngine(GAE)では利用できません。

設定

LDAP認証では python-ldap モジュールを使用します。このため、事前にインストールしておくことが必要です。

pyton-ldap のインストール方法
easy_install python-ldap

easy_install ではエラーが発生してインストールできない事があります。 その場合次のサイトから、ダウンロードしてインストールするか、OSのパッケージ管理ツールを使用します。

pypi python-ldap (ソース 及び Windows版インストーラのダウンロード)

設定前に アクセス制御の基本的な設定 を完了しておく必要があります。また 各認証方式での挙動の違い も参照下さい。
モデル定義(db.pyなど)にて、 login_methods リスト値に ldap_auth() 関数を追加するか置き換えます。

認証方式を置き換えた例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods = [ldap_auth(
   server='ec2-107-22-99-96.compute-1.amazonaws.com',
   base_dn='ou=People,dc=paper,dc=com')]

パラメータにはLDAPサーバと、検索対象のディレクトリツリーを指定します。

認証画面は user関数の ログイン が使用されます。

Form認証が有効時の挙動について
最初のログイン時、ユーザ情報と共にパスワードが保存されます。 このパスワードを web2pyの画面で変更します。すると、どちらのパスワードを使ってもログイン可能になります。 これはweb2pyで保持するパスワードで、Form認証が通りるためです。 このような挙動に問題がある場合は、Form認証を無効にするか、 login_methods での認証方式の順序を変更してください。 詳細は 認証方式の問い合わせ順とユーザ情報登録 を参照ください。

認証用関数

認証用関数のパラメータについて説明します。

ldap_auth.ldap_auth(server, port, base_dn[, mode, secure, cert_path, bind_dn, bind_pw, filterstr])
server
LDAPサーバを指定します。デフォルトは ‘ldap’ です。
port
サーバのポート番号を指定します。デフォルトは None です。
None の場合、SSL/TLS 使用時は 636 に、その他は 389 にポートが設定されます。
base_dn
検索対象のツリーを指定します。デフォルトは ‘ou=users,dc=domain,dc=com’ です。
ldap_mode

LDAP認証の動作モードを設定します。設定可能な動作モードは次の表です。デフォルトは ‘uid’ です。

動作モード 説明
uid OpenLDAP 検索対象DNは UID(UserID)
uid_r OpenLDAP 複数ツリー検索、検索対象DNは UID
cn OpenLDAP 検索対象DNは CN(Common Name)
company OpenLDAP メールアドレス属性をディレクトリ検索
ad Microsoft Active Directory
domino IBM Lotus Notes/Domino
DN(Distinguished Name 識別名)
secure
SSL/TLS でLDAP認証を行います。デフォルトは False です。 SSL/TLS を使用するには True にします。
cert_path
SSL/TLSでクライアント認証を使う場合に、クライアント証明書のパスを指定します。デフォルトは None です。
このオプションは、secure オプションが True でないと有効にはなりません。
bind_dn
Adminユーザでディレクトリ検索する場合の対象ツリーを指定します。デフォルトは None です。
このパラメータは ldap_mode が ‘ac’ (ActiveDirectory)時のみ有効です。
bind_pw
bind_dn パラメータで使用する Adminユーザのパスワードを指定します。デフォルトは None です。
filterstr

特定部署のユーザのみを認証するなど、認証するユーザを制限するためのフィルタを指定します。デフォルトは None です。 このパラメータは ldap_mode が ‘ad’ ‘company’ そして ‘uid_r’ の時のみ有効です。

設定するフィルタは RFC4515 を順守している必要があります。 RFC4515 については、 原文 もしくは 日本語訳 を参照して下さい。

使用例

ldap_mode=’ uid ‘ の設定例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods = [ldap_auth(
   server='ec2-107-22-99-96.compute-1.amazonaws.com',
   base_dn='ou=People,dc=paper,dc=com')]
LDAPサーバには AWS(Amazon Web Service)上にインストールした OpenLDAP を使用しています。
この設定例での LDAP検索条件は次のようになります。
uid=ユーザid, ou=People, dc=paper, dc=com

ldap_mode=’ cn ‘ の設定例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods = [ldap_auth(ldap_mode='cn',
   server='ec2-107-22-99-96.compute-1.amazonaws.com',
   base_dn='ou=People,dc=paper,dc=com')]

この設定例での LDAP検索条件は次のようになります。

cn=ユーザid , ou=People, dc=paper, dc=com

cn は検索対象が DN(識別名)でなければいけません。つまり属性値の cn では検索されません。

../../../_images/web2py_ac_079r.PNG
(左図) cn が属性値なので 検索しない
(右図) cn が識別名のため 検索する

ldap_mode=’ uid_r ‘ の設定例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods = [ldap_auth(ldap_mode='uid_r',
   server='ec2-107-22-99-96.compute-1.amazonaws.com',
   base_dn=['ou=People,dc=paper,dc=com', 'ou=User,dc=paper,dc=com'])]
uid_r を指定すると、複数の検索ツリーが指定可能です。base_dn パラメータ値はリストで指定します。
この設定例での LDAP検索条件は次のようになります。
uid=ユーザid, ou=People, dc=paper, dc=com
  かつ
uid=ユーザid, ou=User, dc=paper, dc=com

ldap_mode=’ company ‘ の設定例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods = [ldap_auth(ldap_mode='company',
   server='ec2-107-22-99-96.compute-1.amazonaws.com',
   base_dn='ou=People,dc=paper,dc=com')]

この設定例での LDAP検索条件は次のようになります。

ou=People, dc=paper, dc=com ツリーから mail=ユーザid を検索

ldap_mode=’ ad ‘ の設定例

from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods.append(ldap_auth(mode='ad',
   server='my.domain.controller',
   base_dn='ou=Users,dc=domain,dc=com'))

ad(Active Directory)については、次のサイトで詳しく説明しています。

How to set up web2py + ldap with Windows Active Directory

ldap_mode=’ domino ‘ の設定例

auth.settings.login_methods.append(ldap_auth(mode='domino',
   server='my.domino.server'))