OpenPNE3で認証プラグインを作る場合はこんな感じなのかな?

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()したり