.. meta::
:keywords: web2py, framework, Access control, アクセス制御, 認証, LDAP
.. raw:: html
web2py version: 1.99.4
.. _ac_authentication_ldap:
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版インストーラのダウンロード)
| 設定前に :ref:`ac_setup` を完了しておく必要があります。また :ref:`ac_methods_variance` も参照下さい。
| モデル定義(db.pyなど)にて、 :attr:`~Auth.settings.login_methods` リスト値に :func:`~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関数の :ref:`ac_user_login` が使用されます。
**Form認証が有効時の挙動について**
最初のログイン時、ユーザ情報と共にパスワードが保存されます。
このパスワードを web2pyの画面で変更します。すると、どちらのパスワードを使ってもログイン可能になります。
これはweb2pyで保持するパスワードで、Form認証が通りるためです。
このような挙動に問題がある場合は、Form認証を無効にするか、 :attr:`~Auth.settings.login_methods` での認証方式の順序を変更してください。
詳細は :ref:`ac_authentication_orderby_methods_register_inf_user` を参照ください。
認証用関数
----------
認証用関数のパラメータについて説明します。
.. py:module:: ldap_auth
.. py:function:: 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 では検索されません。
.. figure:: ../../../images/web2py_ac/web2py_ac_079r.PNG
:figwidth: 100%
:align: left
| (左図) 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'))