2

たとえば、データベースにテーブルがあります:

News:
id | user_id | title | body

および CRUD:

public function executeIndex(sfWebRequest $request)
public function executeNew(sfWebRequest $request)
public function executeShow(sfWebRequest $request)
public function executeCreate(sfWebRequest $request)
public function executeEdit(sfWebRequest $request)
public function executeUpdate(sfWebRequest $request)
public function executeDelete(sfWebRequest $request)
protected function processForm(sfWebRequest $request, sfForm $form)

これを保護するための最良の方法は何ですか? USER が自分のNewsのみを編集、更新、および削除できることを望みます。これを行うことができます-現在のIDユーザーを取得し、ニュースと次のリダイレクトのuser_idと比較します。多分私は preExecute または yaml ファイルでこれを作ることができますか?

4

2 に答える 2

4

私はそのようなことをしていました。

myUser.class.php私は、メソッドを使用して(アプリケーションlibディレクトリ内の)Userクラスを拡張することを選択しcan($what, Doctrine_Record $with)、同様に、constなどのいくつかのタイプの更新タイプも宣言しUPDATE = 'update';ました。

その後preExecute()、現在リクエストされているオブジェクト(あなたの場合はNewsオブジェクト)を取得し、を呼び出しif (!$this->getUser()->can(myUser::UPDATE, $news)) { /* redirect or whatever */ }ました。

ご覧のとおり、非常に読みやすく、保守が容易です。

このようにして、すべてのアクセスロジックを1つのメソッド-can()にまとめ、必要なロジックを指定できます。

願っています、それはあなたを助けます。

たとえば、can()メソッドは次のようになります。

switch(get_class($with))
{
    case 'News':
        if ($with->getUserId() != $this->getProfile()->getId()) // Assuming that getProfile() gives me a User class which News record is referenced
        {
            switch ($what)
            {
                case self::UPDATE:
                    return false;
                case self::DELETE:
                    return false;
            }
        }
        else
        {
            return true; // The user is owner - he can do whatever he want.
        }
        break;
    default:
        return false; // or true, don't know what you need
}
于 2012-04-27T09:31:14.293 に答える
0

私もほとんど同じことをしました。しかし、私は sfUser クラスを拡張していません。symfonyのフィルター チェーンhttp://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer#chapter_06_filtersを使用し、ルート構成を解析できる独自の SecurityFilter を作成しました。

routing.yml の特定のルートにオプションを追加しました

contact_list:
  url: /contacts/:usergroup
  param: { module: contacts, action: index }
    options: { securityManager: UsergroupListSecurityManager }

次に例を示します。 securityFilter は、UsergroupListSecurityManager のインスタンスを使用して、ページの表示が許可されているかどうかを確認します。

そのため、デフォルトの「securityManager」を設定し、特定のルートで特定の「securityManagers」を定義することができました。また、別のルートや他のコンテキスト (contextmenu またはツールバーの作成) で「securityManager」を再利用することもできました。

于 2012-04-30T11:41:29.867 に答える