sfDoctrineGuardPluginについてのメモ

symfonyには次のようなサイトのユーザー管理機能をまとめたプラグインがあります

  • ユーザーのログイン機能
  • ユーザー一覧をメンテナンスする管理画面
  • コマンドラインからユーザーの情報を編集する機能
  • 未登録のユーザーがユーザー登録できる画面
  • パスワードを忘れたユーザーがパスワードを再発行できる画面
  • ユーザーへのパーミッション・グループの付与と管理

それが「sfDoctrineGuardPlugin」です。
プラグインに付属しているREADMEの翻訳も合わせて参照してください。

sfDoctrineGuardPlugin で使えるコマンド(タスク)一覧

guard
  :add-group                   ユーザーにグループを追加する
  :add-permission              ユーザーにパーミッションを追加する
  :change-password             ユーザーのパスワードを変更する
  :create-user                 ユーザーを作成する
  :promote                     ユーザーをスーパー管理者に設定する

symfony guard:add-group [--application[="..."]] [--env="..."] username group
symfony guard:add-permission [--application[="..."]] [--env="..."] username permission
symfony guard:change-password [--application[="..."]] [--env="..."] username password
symfony guard:create-user [--is-super-admin] [--application[="..."]] [--env="..."] email_address username password [first_name] [last_name]
symfony guard:promote [--application[="..."]] [--env="..."] username

sfDoctrineGuardPlugin のデフォルト URL 一覧

sfDoctrineGuardPlugin はルーティングを内部で自前で追加します。これは次のような URL になっています。

  • サインイン(ログイン) /guard/login
  • サインアウト(ログアウト) /guard/logout
  • ユーザー登録 /guard/register
  • パスワード再発行 /guard/forgot_password
  • ユーザー管理 /guard/users
  • グループ管理 /guard/groups
  • パーミッション管理 /guard/permission

なお、このルーティングの自動登録は、プラグインコンフィギュレーションである sfDoctrineGuardPluginConfiguration クラスの initialize() 内で、routing.load_configuration イベントを監視して、実際の処理は sfDoctrineGuardPlugin/lib/routing/sfGuardRouting.class.php 内で行われています。

URL をカスタマイズする場合は、README にあるように routing.yml に手作業で各ルーティングを追加することもできますが、上記ファイルのコードを参考にして、自動で自前 URL のルーティングを追加するようにもできます。

※パフォーマンス的には、routing.yml に書いた方が良いと思われます。

エンドユーザー用の画面のリソースを翻訳する

プラグインのテンプレートはi18n対応しているので、翻訳ファイルを用意することで日本語で表示できます。

の最後の方に手順を書いておきました。

ログイン状態を Cookie に記憶

ログイン画面で Cookie への記憶にチェックできますが、この機能を有効にするには sfGuardRememberMeFilter フィルターを有効にしておく必要があります。
README の手順では「オプション」と書いてあるので注意が必要です。

また、sfGuardRememberMeFilter のコードはそのままではエラーになります。
以下の 2 点を修正する必要があるようです。

<?php
-            ->innerJoin('r.sfGuardUser u')
+            ->innerJoin('r.User u')
<?php
-       $this->context->getUser()->signIn($q->fetchOne()->sfGuardUser);
+       $this->context->getUser()->signIn($q->fetchOne()->User);

スキーマでリレーションのエイリアスを「User」と定義しているためです。

パスワードの再発行時のメール

パスワードの再発行を行う場合、再発行用の URL の通知と、変更後のパスワードの通知の 2 つのメールが送信されます。
このうち、変更後のパスワード通知メールにはパスワードが平文で記載されていますので、変更した方がよいかと思います。

メールの本文を変更する場合は、該当するテンプレートファイルをカスタマイズします。手順はREADMEに記載されていますので、参照してください。