web2py version: 1.99.4

2.1. Form認証とユーザ管理機能

Form認証は web2py の認証方式の中でも標準となる方式です。この認証方式はユーザ管理機能とも密接に関連しています。
ここではアクセス制御の基本的な設定を始めとして、Form認証を含めたユーザ管理機能全般について説明を行います。

Note

Form認証(フォーム認証)とは、HTMLフォームを用いてユーザのID及びパスワードを送信する認証方式のことです。

2.1.1. アクセス制御の基本的な設定

web2py でアクセス制御の仕組みを動かすためには、次の設定が必要になります。

  • Auth クラスのインスタンスを作成

    アプリケーション生成後のモデル定義(db.py)では、既に次のインスタンス定義が存在します。

    from gluon.tools import Auth
    auth = Auth(db, hmac_key=Auth.get_or_create_key())
    

    Authクラスのインスタンスは通常、 auth 変数に代入します。別の変数名でも問題は無いのですが、慣習的に auth が使用されます。今回のドキュメントでも全て、 auth を使用します。

  • アクセス制御で使用するテーブル定義

    アクセス制御で使用する幾つかのテーブルの定義を行います。このテーブル定義についても、既にモデル定義(db.py)内に記述されています。

    auth.define_tables()
    

    もしユーザIDとして ユーザ名 を使用したい場合は、次のようにパラメータ username を True で渡す必要があります。

    auth.define_tables(username=True)
    

    デフォルト(つまり username=False)は、ユーザIDとして、 メールアドレス を使用します。

  • ユーザ管理機能を公開するための関数定義

    Authクラスにはユーザ管理用のメソッドが幾つも含まれています。これらのメソッドは必要に応じて公開しなければなりません。このために使用する関数の定義もアプリケーション作成時に、コントローラ default.py ファイルに user 関数として記述されています。

    def user():
        """
        exposes:
        http://..../[app]/default/user/login
        http://..../[app]/default/user/logout
        http://..../[app]/default/user/register
        http://..../[app]/default/user/profile
        http://..../[app]/default/user/retrieve_password
        http://..../[app]/default/user/change_password
        use @auth.requires_login()
            @auth.requires_membership('group name')
            @auth.requires_permission('read','table name',record_id)
        to decorate functions that need access control
        """
        return dict(form=auth())
    

    ユーザ管理用関数を user以外の名前に、また default.py 以外のコントローラファイルに記述することも可能です。 しかしその場合は Authコンストラクタ呼び出し時に、パラメータで指定するか、インスタンスの属性値を変更する必要があります。 詳細は Authコンストラクタの説明を参照してください。

    このドキュメントではデフォルト設定のまま説明していきます。

以上の3点の設定があれば、アクセス制御は動くようになります。また、これらの設定はアプリケーション作成時にデフォルトで記述 されています。

2.1.2. ユーザ管理機能(user関数)

ユーザ管理機能として、 user 関数では次の機能を公開しています。

機能 パラメータ URL
ログイン login http://[srv]/[app]/default/user/login
ログアウト logout http://[srv]/[app]/default/user/logout
ユーザ登録 register http://[srv]/[app]/default/user/register
ユーザプロファイル変更 profile http://[srv]/[app]/default/user/profile
パスワード変更 change_password http://[srv]/[app]/default/user/change_password
ユーザ登録確認 verify_email http://[srv]/[app]/default/user/verify_email
ユーザ名確認 retrieve_username http://[srv]/[app]/default/user/retrieve_username
パスワードリセット依頼 request_reset_password http://[srv]/[app]/default/user/request_reset_password
パスワードリセット登録 reset_password http://[srv]/[app]/default/user/reset_password
偽装(なりすまし) impersonate http://[srv]/[app]/default/user/impersonate
所属グループ表示 groups http://[srv]/[app]/default/user/groups
権限不足表示 not_authorized http://[srv]/[app]/default/user/not_authorized

URL の [srv] はアプリケーションが稼動するサーバ、[app]はアプリケーション名になります。

これらの各機能について、画面イメージを使用しながら説明します。

ログイン

パラメータ: login

ログイン画面を表示します。この画面はForm認証で使用しますが、他の認証方式(SMTP,LDAPなど)でも使用します。

../../_images/web2py_ac_023r.JPG

ログインの画面

../../_images/web2py_ac_024r.JPG

username=True 時のログインの画面

ログアウト

パラメータ: logout

ログアウト機能を提供します。

ユーザ登録

パラメータ: register

新規ユーザの登録機能を提供します。

../../_images/web2py_ac_025r.JPG

ユーザ登録の画面

ユーザプロファイル変更

パラメータ: profile

ユーザプロファイル(ユーザ情報)の変更機能です。

../../_images/web2py_ac_028r.JPG

ユーザプロファイル変更の画面

パスワード変更

パラメータ: change_password

パスワードの変更機能です。

../../_images/web2py_ac_026r.JPG

パスワード変更の画面

ユーザ登録確認

パラメータ: verify_email

ユーザ登録時に登録したメールアドレスにシステムからメールを送信し、ユーザが受信したメール内からこの機能にアクセスする ことによりユーザ確認を行う機能です。

この機能を使用するためには、Authインスタンスの次の属性値がTrueになっている必要があります。

auth.settings.registration_requires_verification = True

ユーザ登録時に登録したアドレスにメールが送信されます。 メールに記述されているURLをクリックして、登録ユーザを有効にする必要があります。

メールに記述されるURLは、次の属性値に設定します。このとき verfiy_email をURLパラメータに含める必要があります。

auth.messages.verify_email = 'Click on the link http://' + \
    request.env.http_host + \
    URL(r=request,c='default',f='user',args=['verify_email']) + \
    '/%(key)s to verify your email'

auth.messages.verify_email 属性はデフォルトで設定されています。 メッセージ変更の必要性がない場合、特に設定することはありません。

この機能は Authクラスのメール設定が必要です。

../../_images/web2py_ac_072r.PNG

ユーザ登録確認のフロー

ユーザ名確認

パラメータ: retrieve_username

usernameフィールドが有効な場合、使用できます。

登録したメールアドレスを retrieve_username の画面に入力すると、 ユーザ 名をメールで送信します。 ユーザ名を忘れた場 合などに使用します。

../../_images/web2py_ac_029r.JPG

ユーザ名確認の画面

パスワードリセット依頼

パラメータ: request_reset_password

パスワードリセットするためには、まずパスワードリセットの依頼で、メールアドレスを入力し登録します。

../../_images/web2py_ac_030r.JPG

パスワードリセット依頼の画面

パスワードリセット登録

パラメータ: reset_password

パスワードリセットの依頼で登録したメールアドレスに届いたメールのURLを開くと、パスワードリセットの登録画面が開きます。

この画面からパスワードの変更(リセット)が可能になります。

../../_images/web2py_ac_031r.JPG

パスワードリセット登録の画面

../../_images/web2py_ac_073r.PNG

パスワードリセットのフロー

偽装(なりすまし)

パラメータ: impersonate

他のユーザに対する偽装(なりすまし)ができます。

偽装を使用するには権限が必要です。 「auth_user テーブル」 に対して、impersonateパーミッションを 所持している必要があります。 権限付与には次のように add_permission() を使用します。

auth.add_permission(5,'impersonate','auth_user')
                        # グループIDが5のユーザにimpersonateパーミッションを付与

権限を持ったユーザで impersonate の画面を開きます。 ここで偽装したいターゲットユーザの id (auth_userのidフィールドのこと)を入力します。

../../_images/web2py_ac_032r.JPG

偽装(なりすまし)の画面

偽装が成功すると次のように、ターゲットユーザの auth_user レコード内容が画面に表示されます。

../../_images/web2py_ac_033r.JPG

偽装(なりすまし)成功時の画面

ユーザプロファイル変更 の画面を開くと、ターゲットユーザの情報が表示されます。

../../_images/web2py_ac_034r.JPG

偽装(なりすまし)成功時のユーザプロファイル変更(profile)の画面

偽装機能のUIは、システム管理者向けで親切ではありません。本格的に使用する場合は、画面カスタマイズの考慮も必要です。

所属グループ表示

パラメータ: groups

ユーザが所属するグループを表示する機能です。

../../_images/web2py_ac_035r.JPG

所属グループ表示の画面

権限不足表示

パラメータ: not_authorized

権限不足時に表示する画面です。

../../_images/web2py_ac_036r.JPG

権限不足表示の画面

この画面のカスタマイズは、サンプルとして用意されているビューの default/user.html を変更します。 コードは次のようになっています。

{{extend 'layout.html'}}
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
<div id="web2py_user_form">
{{=form}}
{{if request.args(0)=='login':}}
{{if not 'register' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='register')}}">register</a>
{{pass}}
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='request_reset_password')}}">lost password</a>
{{pass}}
{{pass}}
</div>

これを次のように変更してみます。

{{extend 'layout.html'}}
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
{{if request.args(0)=='not_authorized':}}                                       <!-- 修正 -->
<div style="background-color:pink;margin-top:10px;padding:5px 10px;float:left"> <!-- 修正 -->
{{=T('Please contact your system administrator.')}}                             <!-- 修正 -->
</div>                                                                          <!-- 修正 -->
{{else:}}                                                                       <!-- 修正 -->
<div id="web2py_user_form">
{{=form}}
{{if request.args(0)=='login':}}
{{if not 'register' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='register')}}">register</a>
{{pass}}
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='request_reset_password')}}">lost password</a>
{{pass}}
{{pass}}
</div>
{{pass}}                                                                        <!-- 修正 -->

変更した結果、次のように表示されます。

../../_images/web2py_ac_037r.JPG

カスタマイズ後の権限不足表示の画面

2.1.3. ユーザ管理機能(user関数)の国際化

user関数の各画面は、web2py の国際化機能(i18n)を使用すれば容易に多言語化可能です。ログイン画面での日本語化の例を示してみます。

../../_images/web2py_ac_074r.PNG

日本語表示したログイン画面

これはweb2py管理画面にある国際化(Languages)で、必要な翻訳文を登録するだけで実現できます。

ログイン画面では、画面下方に registerlost password の2つのリンクが表示されます。それぞれ ユーザ登録パスワードリセット依頼 機能へリンクですが日本語表示になりません。理由はサンプルとして用意されている default/user.html ビューで、文字列をベタ打ちしているからです。問題の箇所を示します。

{{if request.args(0)=='login':}}
{{if not 'register' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='register')}}">register</a>
{{pass}}
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='request_reset_password')}}">lost password</a>
{{pass}}
{{pass}}

リンクが必要なければ、このコード部分を削除してもいいです。また register 及び request_rest_password の機能を無効にしている場合は、リンクは表示されません。

もしリンクを多言語で表示したい場合は、コードを次のように変更するのがよいでしょう。

{{if request.args(0)=='login':}}
{{if not 'register' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='register')}}">{{=T('Register')}}</a>
{{pass}}
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
<br/><a href="{{=URL(r=request,args='request_reset_password')}}">{{=T('Lost password?')}}</a>
{{pass}}
{{pass}}

つまり翻訳関数である  T  を使用し、文字列を T関数のパラメータにします。また設定する文字列を Register と Lost password? にします。こうすることでuser関数使用時に上部に表示される、ナビゲーションバーの文字列と同一なります。

../../_images/web2py_ac_075r.PNG

下のリンク文字列まで日本語にしたログイン画面