OpenPNE3で認証プラグインを作る場合はこんな感じなのかな?
- オフィシャルにドキュメントがないのはつらいですな。
ファイル構成
- lib/
- form/
- opAuthLoginForm.class.php
-- ログインに使うフォームを記述
- opAuthConfigForm.class.php
-- (必要に応じて)フォームのconfig用(既存のものには空のサブクラスがある)
- user/
- opAuthAdapter.class.php
-- 認証に必要な部分を記述する
-- ここで認証レベルを User に追加できる? -- これはBehaviorを使った方がいい?
- validator/
- opAuthValidator.class.php
-- opAuthLoginForm で追加のValidatorが必要ならここに
- model/
-- (必要に応じて)OpenPNEの標準とは違うDatabaseの情報を使う場合とか
認証フロー
- opAuthAdapter#authenticate() が opAuthLoginForm を呼び出してごにょごにょする
- 認証が成功した時に Member の idを返す/失敗したらfalseを返す
- opAuthLoginForm#configure() に フォームの記述
- #mergePostValidator() で opAuthValidator を追加
- MemberConfig の値とパスワードのチェックをするのであれば opAuthValidatorConfigAndPassword を使える。引数は config_name と(フォームの)field_name をarray() で。
- opAuthValidator#doClean() で認証のチェックとか
エラー画面
- 標準の loginError テンプレートはエラーの原因を返せない
- 「IDまたはパスワードが合っていません」「有効期限が切れています」など識別したい。
- 以下のようにするとValidatorのグローバルエラーを表示可能になる
$form = $sf_user->getAuthForm();
$options = array(
'title' => __('Errors'),
);
op_include_box('loginError',
__('Failed in login.') . $form->renderGlobalErrors(),
$options
);
メモ
- 仮登録とかの処理がopAuthAdapterにあった
- ログインを呼び出しているのは lib/action/sfOpenPNEMemberAction.class.php
- $sfUser(lib/user/sfOpenPNESecurityUser.class.php)が AuthFormを作成、および#login()を実行
- #login()では AuthAdapter を選択して #authenticate()を実行(戻り値は$memberId || false)
- あとは #setAuhtenticated(true)したり、#initializeCredentials()したり