2.1. 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など)でも使用します。
ログアウト¶
パラメータ: logout
ログアウト機能を提供します。
ユーザ登録¶
パラメータ: register
新規ユーザの登録機能を提供します。
ユーザプロファイル変更¶
パラメータ: profile
ユーザプロファイル(ユーザ情報)の変更機能です。
パスワード変更¶
パラメータ: change_password
パスワードの変更機能です。
ユーザ登録確認¶
パラメータ: 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クラスのメール設定が必要です。
ユーザ名確認¶
パラメータ: retrieve_username
usernameフィールドが有効な場合、使用できます。
登録したメールアドレスを retrieve_username の画面に入力すると、 ユーザ 名をメールで送信します。 ユーザ名を忘れた場 合などに使用します。
パスワードリセット依頼¶
パラメータ: request_reset_password
パスワードリセットするためには、まずパスワードリセットの依頼で、メールアドレスを入力し登録します。
パスワードリセット登録¶
パラメータ: reset_password
パスワードリセットの依頼で登録したメールアドレスに届いたメールのURLを開くと、パスワードリセットの登録画面が開きます。
この画面からパスワードの変更(リセット)が可能になります。
偽装(なりすまし)¶
パラメータ: impersonate
他のユーザに対する偽装(なりすまし)ができます。
偽装を使用するには権限が必要です。 「auth_user テーブル」 に対して、impersonateパーミッションを 所持している必要があります。 権限付与には次のように
add_permission()
を使用します。auth.add_permission(5,'impersonate','auth_user') # グループIDが5のユーザにimpersonateパーミッションを付与権限を持ったユーザで impersonate の画面を開きます。 ここで偽装したいターゲットユーザの id (auth_userのidフィールドのこと)を入力します。
偽装が成功すると次のように、ターゲットユーザの auth_user レコード内容が画面に表示されます。
ユーザプロファイル変更 の画面を開くと、ターゲットユーザの情報が表示されます。
偽装機能のUIは、システム管理者向けで親切ではありません。本格的に使用する場合は、画面カスタマイズの考慮も必要です。
所属グループ表示¶
パラメータ: groups
ユーザが所属するグループを表示する機能です。
権限不足表示¶
パラメータ: not_authorized
権限不足時に表示する画面です。
この画面のカスタマイズは、サンプルとして用意されているビューの 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}} <!-- 修正 -->変更した結果、次のように表示されます。
2.1.3. ユーザ管理機能(user関数)の国際化¶
user関数の各画面は、web2py の国際化機能(i18n)を使用すれば容易に多言語化可能です。ログイン画面での日本語化の例を示してみます。
これはweb2py管理画面にある国際化(Languages)で、必要な翻訳文を登録するだけで実現できます。
ログイン画面では、画面下方に register と lost 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関数使用時に上部に表示される、ナビゲーションバーの文字列と同一なります。