My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
sfGuardPlugin  
認証と権限の付与機能を追加する
PlugIns
Updated Feb 4, 2010 by hidehid...@gmail.com

このドキュメントは下記の内容を翻訳したものです。

sfGuard plugin

sfGuardPluginはsymfonyのプラグインでsymfonyの標準的な機能の上に認証と権限の付与機能を提供します。

これは設定変更可能なプラグインで、symfonyアプリケーションをすぐに安全にするモデル(user、groupとpermissionオブジェクト)とモジュール(backendとfrontend)を提供します。

インストレーション

  • プラグインをインストールする
      symfony plugin-install http://plugins.symfony-project.com/sfGuardPlugin
  • モデルをリビルドする
      symfony propel-build-model
      symfony propel-build-sql
  • 一からデータベーステーブルを更新する(これによってすべての既存のテーブルは削除され、それから再び作成されます):

      symfony propel-insert-sql
もしくはdata/sql/plugins.sfGuardAuth.lib.model.schema.sqlで生成されたSQL命令文を使い新しいテーブルを作成することができます。
  • デフォルトのフィクスチャをロードします (オプションとして - superadminユーザーを作成します)
      symfony propel-load-data
  • settings.ymlで一つかそれ以上のモジュールを有効にします (オプション)
    • backendアプリケーションに対して: sfGuardUser, sfGuardGroup, sfGuardPermission
    • frontendアプリケーションに対して: sfGuardAuth
      all:
        .settings:
          enabled_modules:      [default, sfGuardGroup, sfGuardUser, sfGuardPermission]
  • キャッシュをクリアします
      symfony cc
  • オプションとしてfilters.ymlで"Remember Me"フィルタを有効にします
      security:
        class: sfGuardBasicSecurityFilter

アプリケーションをセキュアにする

symfonyアプリケーションをセキュアにするために:

  • settings.ymlsfGuardAuthモジュールを有効にします
    all:
      .settings:
        enabled_modules: [..., sfGuardAuth]
  • settings.ymlでデフォルトのloginとsecureモジュールを変更します
    login_module:           sfGuardAuth
    login_action:           signin

    secure_module:          sfGuardAuth
    secure_action:          secure
  • myUser.class.phpで親クラスを変更します
    class myUser extends sfGuardSecurityUser
    {
    }
  • オプションとして次のルーティングルールをrouting.ymlに追加します
    sf_guard_signin:
      url:   /login
      param: { module: sfGuardAuth, action: signin }

    sf_guard_signout:
      url:   /logout
      param: { module: sfGuardAuth, action: signout }

    sf_guard_password:
      url:   /request_password
      param: { module: sfGuardAuth, action: password }
それぞれのルートのurlパラメータをカスタマイズできます。 注意(N.B.): @homepageルーティングルールがなければなりません(ユーザーがサインアウトするときに使われます)
app.yml構成ファイルでsf_guard_plugin_routes_registerをfalseに定義せずsfGuardAuthモジュールを有効にしている場合これらのルートは自動的にプラグインによって登録されます:

    all:
      sf_guard_plugin:
        routes_register: false
  • security.ymlでいくつかのモジュールもしくはアプリケーションをセキュアにします
    default:
      is_secure: on
  • これでおしまいです。これでセキュアなページにアクセスしようとすると、ログインページにリダイレクトされます。
  • デフォルトのフィクスチャファイルをロードしている場合、ユーザー名とパスワードをどちらもadminとしてログインしてみて下さい。

ユーザー、パーミッションとグループを管理する

ユーザー、パーミッションとグループの管理をできるようにするために、sfGuardPluginにはbackendアプリケーションに統合できる3つのモジュールが備わっています。 これらのモジュールはsymfonyのadminジェネレータのおかげで自動生成されます。

  • settings.ymlでモジュールを有効にします
    all:
      .settings:
        enabled_modules: [..., sfGuardGroup, sfGuardPermission, sfGuardUser]
  • デフォルトのルートでモジュールにアクセスします:

    http://www.example.com/backend.php/sfGuardUser

sfGuardAuthモジュールテンプレートをカスタマイズする

デフォルトで、sfGuardAuthモジュールには2つのとてもシンプルなテンプレートが備わっています:

  • signinSuccess.php
  • secureSuccess.php

これらのテンプレートの一つをカスタマイズしたい場合:

  • アプリケーションでsfGuardAuthモジュールを作ります(init-moduleタスクは使わず、sfGuardAuthディレクトリを作るだけです)

  • sfGuardAuth/templatesディレクトリにカスタマイズしたいテンプレートの名前を持つテンプレートを作ります

  • symfonyはこれでデフォルトのレンダラの代わりにテンプレートをレンダーします

sfGuardAuthモジュールアクションをカスタマイズする

メソッドをカスタマイズするもしくはsfGuardAuthに追加したい場合:

  • アプリケーションにsfGuardAuthモジュールを作成します

  • BasesfGuardAuthActionsから継承するactionsディレクトリにactions.class.phpファイルを作成して下さい
  • (symfonyによってオートロードされないのでBasesfGuardAuthActionsをインクルードすることを忘れないで下さい)

    <?php

    require_once(sfConfig::get('sf_plugins_dir').'/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php');

    class sfGuardAuthActions extends BasesfGuardAuthActions
    {
      public function executeNewAction()
      {
        return $this->renderText('This is a new sfGuardAuth action.');
      }
    }

sfGuardSecurityUserクラス

このクラスはsymfonyからのsfBasicSecurityUserクラスを継承しsymfonyアプリケーションでuserオブジェクトに対して使われます。(先にmyUser基底クラスを変更したからです)

ですので、アクセスするために、アクションで標準的な$this->getUser()かテンプレートで$sf_userを使うことができます。

sfGuardSecurityUserは次のようなメソッドを追加します:

  • signIn()signOut()メソッド
  • getGuardUser()sfGuardUserオブジェクトを返す
  • sfGuardUserオブジェクトに直接アクセスするための一連のプロキシメソッド

例えば、現在のユーザー名を取得するためには次のようなコードになります:

    $this->getUser()->getGuardUser()->getUsername()

    // or via the proxy method
    $this->getUser()->getUsername()

Super administratorのフラグ

sfGuardPluginにはsuper administratorの概念があります。super administratorであるユーザーはすべてのクレデンシャルチェックを回避します。

super administratorフラグはウェブ上で設定できず、データベースで直接フラグを設定するかpakeタスクを使います:

    symfony promote-super-admin admin

バリデータ

sfGuardPluginにはモジュールで使うことができる一つのバリデータ: sfGuardUserValidatorが備わっています。

このバリデータはユーザーとパスワードを検証して自動的にユーザーをサインインさせるsfGuardAuthモジュールによって使用されます。

sfAuthUserモデルをカスタマイズする

sfAuthUserモデルはとてもシンプルです。emailもしくはfirst_nameもしくはbirthdayカラムは存在しません。 メソッドをクラスに追加できないので、sfAuthPlugin gives you the possibility to define a user profile class.

デフォルトでsfAuthUsersfGuardUserProfileクラスを探します。

下記のコードはschema.ymlに追加できるsfGuardProfileクラスの例です:

    sf_guard_user_profile:
      _attributes: { phpName: sfGuardUserProfile }
      id:
      user_id:     { type: integer, foreignTable: sf_guard_user, foreignReference: id, required: true, onDelete: cascade }
      first_name:  varchar(20)
      last_name:   varchar(20)
      birthday:    date

これでuserオブジェクトを通してユーザープロファイルにアクセスできます:

    $this->getUser()->getGuardUser()->getProfile()->getFirstName()

    // or via the proxy method
    $this->getUser()->getProfile()->getFirstName()

getProfile()メソッドは関連したユーザープロファイルオブジェクトを取得するもしくはまだ存在しない場合新しいものを作成します。

ユーザーを削除するとき、関連したプロファイルも削除されます。

app.ymlでユーザープロファイルクラスと外部キー名を変更できます:

    all:
      sf_guard_plugin:
        profile_class:      sfGuardUserProfile
        profile_field_name: user_id

外部メソッドでユーザーパスワードを確認する

LDAPサーバーが既にあるのでパスワードをデータベースに保存したくない場合、a .htaccessファイルもしくは別のテーブルにパスワードを保存する場合、app.ymlで独自のcheckPassword(スタティックメソッドもしくは関数)を呼び出すことができます:

    all:
      sf_guard_plugin:
        check_password_callable: [MyLDAPClass, checkPassword]

symfonyが$this->getUser()->checkPassword()メソッドを呼び出すとき、メソッドもしくは関数を呼び出します。関数は2つのパラメータを取らなければならず、1番目はユーザー名で2番目はパスワードです。trueもしくはfalseが返されます。この関数に対するテンプレートの例です:

    function checkLDAPPassword($username, $password)
    {
      $user = LDAP::getUser($username);
      if ($user->checkPassword($password))
      {
        return true;
      }
      else
      {
        return false;
      }
    }

パスワードを保存するために使われるアルゴリズムを変更する

デフォルトでは、パスワードはsha1()ハッシュとして保存されます。しかしapp.ymlでこれを別のcallableに変更できます:

    all:
      sf_guard_plugin:
        algorithm_callable: [MyCryptoClass, MyCryptoMethod]

もしくは

    all:
      sf_guard_plugin:
        algorithm_callable: md5

アルゴリズムはそれぞれのユーザーに対して保存されるので、後で現在のユーザーに対してすべてのパスワードを再生成する必要無しに考えを変えることができます。

名前もしくは"Remember Me"クッキーの期限を変更する

デフォルトで、"Remember Me"機能はsfRememberという15日間持続する名前のクッキーを作成します。app.ymlでこの振る舞いを変更できます:

    all:
      sf_guard_plugin:
         remember_key_expiration_age:  2592000   # 30日を秒単位で
         remember_cookie_name:         myAppRememberMe

sfGuardAuthリダイレクトハンドリングをカスタマイズする

ログインの成功の後にサユーザーをユーザーのプロファイルにリダイレクトさせたいもしくはサイトのログアウトを定義して下さい。 app.ymlでリダイレクトの値を定義できます:

    all:
      sf_guard_plugin:
        success_signin_url:      @my_route?param=value # デフォルトでプラグインはリファラを使う
        success_signout_url:     module/action         # デフォルトでプラグインはリファラを使う

TODOとChangelog

READMEを参照して下さい。


Sign in to add a comment
Powered by Google Project Hosting