.. meta::
:keywords: web2py, framework, Access control, アクセス制御, 認証, 各認証方式
.. raw:: html
web2py version: 1.99.4
.. _ac_methods_outline:
各認証方式の概要
================
モジュール
----------
標準で使用可能な Form認証 以外の認証方式については、モジュールが次のディレクトリ下に存在します。 ::
/gluon/contrib/login_method/
使用する場合はインポートし、各認証方式の説明に従って必要な設定を行う必要があります。
設定方法
--------
認証方式を使用するためには、次の属性値を変更する必要があります。
.. currentmodule:: tools
.. attribute:: Auth.settings.login_methods
認証用関数を指定します。リスト値で設定しますので、複数の認証関数を指定することが可能です。
デフォルト値は [auth] です( auth.settings.login_methods = [auth] )。[auth]はForm認証のことを示しています。
設定例( Form認証→SMTP認証 順に問い合わせ ) ::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods.append(email_auth("smtp.gmail.com:587", "@gmail.com"))
設定例( SMTP認証→Form認証 順に問い合わせ ) ::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods.insert(0, email_auth("smtp.gmail.com:587", "@gmail.com"))
設定例( SMTP認証のみ利用 )::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods = [email_auth("smtp.gmail.com:587", "@gmail.com")]
.. attribute:: Auth.settings.login_form
認証用ログインフォームを指定します。値には使用する認証方式のインスタンスを設定します。
この属性値に複数のインスタンスは指定できません。
デフォルト値は auth です( auth.settings.login_form = auth )。
設定例( OpenIDを利用 ) ::
from gluon.contrib.login_methods.openid_auth import OpenIDAuth
auth.settings.login_form = OpenIDAuth(auth)
どちらを設定するかは、認証方式によって変わります。
.. _ac_methods_variance:
各認証方式での挙動の違い
------------------------
設定方法以外でも各認証方式では、少しずつ挙動が違っています。いくつか項目を使って説明します。
ユーザIDの保存フィールド
Form認証はデフォルトのIDは **メールアドレス** です。メールアドレスの場合は、auth_userテーブルの emailフィールドに保存します。
:func:`~Auth.define_table` のパラメータ username が True の場合、
auth_userテーブルに username フィールドが追加され、IDに **ユーザ名** が使用できます( :ref:`ac_setup` )。
From認証以外では各々の認証方式によって、保存するフィールドが違います。
未登録ユーザIDでのログイン
Form認証ではユーザ登録がないIDではログインできません。Basic認証も同様です。
しかし他の多くの認証方式では、ユーザ登録がないIDでもログインが可能です。
この場合ログインと共に、ユーザ登録が自動で行われます。
OpenIDについてはログイン可能なのですが、Form認証のユーザとの紐付けが必要になります。
これについては、 :ref:`ac_authentication_openid` で説明します。
拡張ログインフォーム
:attr:`~Auth.settings.login_form` に設定するタイプの認証方式にでは、専用のログインフォームを使用するため他の
認証方式には対応できません。しかし拡張ログインフォームを使用すれば、Form認証のログインフォームとも共存できます。
注意点として拡張ログインフォームは、他の専用ログインフォームを持つ認証方式とは共存できません。
また Googleアカウント認証は、拡張ログインフォームを利用できません。
ユーザ管理機能
:ref:`ac_user` については、Form認証(及び Basic認証)以外では使用できない機能と、あまり意味がない機能があります。
使用できない機能
* :ref:`ac_user_verify_email`
あまり意味がない機能
* :ref:`ac_user_retrieve_username`
* :ref:`ac_user_request_reset_password`
* :ref:`ac_user_reset_password`
必要に応じて、user関数の機能を無効にして下さい。無効化については :attr:`~Auth.settings.actions_disabled` を参照ください。
これらの挙動の違いをまとめたのが次の表です。
.. csv-table::
:header: 認証方式,設定方法,ID保存フィールド,[#f1]_,[#f2]_,[#f3]_
:widths: 15, 10, 20 ,10 ,5 ,5
Form , デフォルト ,email もしくは username ,登録 , ,
Basic , :attr:`~Auth.settings.login_methods` ,email もしくは username ,登録 , ,
SMTP , :attr:`~Auth.settings.login_methods` ,email ,可能 , ,
Googleアカウント, :attr:`~Auth.settings.login_form` ,email もしくは username ,可能 ,使用,不可
Janrain Engage , :attr:`~Auth.settings.login_form` ,registration_id ,可能 ,使用,可能
LDAP , :attr:`~Auth.settings.login_methods` ,email もしくは username ,可能 , ,
OpenID , :attr:`~Auth.settings.login_form` , alt_loginsテーブルの username ,紐付け,使用,可能
.. [#f1] **未登録ユーザIDでのログイン**
| 登録 ・・・・・ ユーザ登録が必要
| 可能 ・・・・・ ログイン時に自動でユーザ登録
| 紐付け ・・・ ログイン可能だがユーザとの紐付けが必要
.. [#f2] **専用ログインフォームを使用**
空白の方式は専用ログインフォームを使用しません。
.. [#f3] **拡張ログインフォームの使用**
空白の方式は専用ログインフォームを使用しません。このため拡張ログインフォームは必要ありません。
.. _ac_authentication_methods_simultaneity:
同時に利用可能な認証方式
------------------------
認証方式の設定方法と拡張ログインフォームの使用有無によって、同時に使用できる認証方式が違ってくるというのを説明しました。
それでは実際に、同時に利用可能な認証方式について図に示してみます。
.. figure:: ../../../images/web2py_ac/web2py_ac_069r.PNG
同時に利用可能な認証方式
まとめると、認証方式を同時に利用を可能かどうか判断する考慮点は2つあります。
* 認証設定で、 :attr:`~Auth.settings.login_form` にインスタンスを設定するかどうか
専用フォームを利用する認証方式は、基本的に1つしか認証方式を選べません。
* 拡張ログインオームを利用できるかどうか
専用フォームを利用する認証方式でも拡張ログインフォームを利用すれば、通常のログインフォームと併用可能です。
.. _ac_authentication_orderby_methods_register_inf_user:
認証方式の問い合わせ順とユーザ情報登録
--------------------------------------
認証方式の問い合わせ順
:attr:`~Auth.settings.login_methods` のリスト値に認証方式を追加した場合、web2py はリスト値に従って順番に、
登録されている認証方式を試していきます。リスト値のデフォルト値は [auth] です。
このため認証方式を追加した場合、Form認証と追加した認証方式を順番に試していきます。設定例を示してみます。 ::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods.append(email_auth("smtp.gmail.com:587", "@gmail.com"))
from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods.append(ldap_auth(
server='ec2-107-22-99-96.compute-1.amazonaws.com',
base_dn='ou=People,dc=paper,dc=com'))
この設定では、Form認証→SMTP認証→LDAP認証 の順に認証を試していきます。
もし特定の認証方式だけ動かしたい場合は、リスト値を上書きする必要があります。 ::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods = [email_auth("smtp.gmail.com:587", "@gmail.com")]
この設定では SMTP認証のみ試します。
リスト値ですので、順番を入れ替えることが可能です。 ::
from gluon.contrib.login_methods.email_auth import email_auth
auth.settings.login_methods.insert(0, email_auth("smtp.gmail.com:587", "@gmail.com"))
from gluon.contrib.login_methods.ldap_auth import ldap_auth
auth.settings.login_methods.insert(1, ldap_auth(
server='ec2-107-22-99-96.compute-1.amazonaws.com',
base_dn='ou=People,dc=paper,dc=com'))
SMTP認証→LDAP認証→Form認証 の順に認証を試します。
ログイン時のユーザ情報登録
ログイン時の認証方式によってユーザ情報を、 auth_user テーブルに登録するタイプとしないタイプがあります。
:attr:`~Auth.settings.login_methods` 属性に設定するタイプの認証方式は、ユーザ情報をコピーして登録します。
登録する情報は、ユーザ名・メールアドレス・パスワード などです。もし :attr:`~Auth.settings.login_methods`
のリスト値に auth が含まれない場合は、パスワードは登録しません。
ユーザが登録されていない場合、ユーザ情報をコピー登録します。
既にユーザが登録されておりパスワードが違っている場合は、パスワードを更新します。
コピーしたユーザ情報での認証
:attr:`~Auth.settings.login_methods` リスト値の先頭に auth が設定されている(デフォルト)場合、
Form認証でもコピーしたユーザ情報での認証が可能になります。
web2py はユーザとパスワードの組み合わせで、各認証方式に問い合わを行います。
このため一方のパスワードを変更した場合、順番に問い合わせを行い、パスワードが一致する方式で認証が行われます。
この時、他の方式で認証した場合は、コピーしたForm認証ユーザのパスワードを更新します。
Form認証のパスワードでログイン
→ Form認証で認証が行われます。
他の認証方式のパスワードでログイン
→ 他の方式で認証が行われると共に、コピーしたForm認証ユーザのパスワードが更新されます。
このような動作が困る場合、リスト値を上書きしてForm認証は使えないようにするか、リスト値の順序を変更します。