2011-07-28 4 views
0

からからCreateQueryで働いていない:解決 - いいえ、再現もうsfContextのは::のgetInstance() - > getUserメソッド()今、バリ

いくつかの特定のアプリケーションのセキュリティのために、私は、テーブルの上に次からCreateQuery機能を持っていることができます。すなわち「管理者」資格情報を持っている場合、またはMembershipDelegate関係に格納されているユーザーの場合にのみ、テーブルレコードにアクセスします。

class OrganisationTable extends Doctrine_Table 
function createQuery($alias = ''){ 

    if (!$alias){ 
     $alias = 'o'; 
    } 

    $query = parent::createQuery($alias); 
    try { 
     $user = sfContext::getInstance()->getUser(); 
    }catch(Exception $e){ 
     if ($e->getMessage() == 'The "default" context does not exist.'){ 
      return $query; 
     }else{ 
      throw $e; 
     } 
    } 

    if ($user->hasCredential('Administrator')){ 
     //all good 

    }else{ 


     $userId = $user->getAttribute('userId'); 
     print "<!--testaa ".print_r($user->getCredentials(),1).'-->'; 
     $query-> 
     leftJoin("$alias.MembershipDelegate mdelsec")-> 
     addWhere ("mdelsec.joomla_user_id=$userId"); 
    } 

    return $query; 
} 

これは、すべてのレベルで正常に動作するようですが、しかし、$ユーザーオブジェクトが空

/** 
    * Person form base class. 
    * 
    */ 
    ... 
    abstract class BasePersonForm extends BaseFormDoctrine 
    { 
     public function setup() 
     { 
     $this->setWidgets(array(

    ... 
      'organisation_id'       => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Organisation'), 'add_empty' => true)), 


    class PersonForm extends BasePersonForm{ 

     public function configure(){ 

      $this->widgetSchema['organisation_id']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter'); 
      $this->widgetSchema['organisation_id']->setOption('renderer_options', array(
      'model' => 'Organisation', 
      'url' => NZGBCTools::makeUriJoomlaCompatible(
        sfContext::getInstance()->getController()->genUrl('organisation/jsonList')) 
      )); 
      $this->validatorSchema['organisation_id']->setOption('required',false); 

を戻ってくるように思われる選択肢のバリデータは、ユーザーオブジェクトを取得する他の方法は、そこにあるさモデルで?レベルのセキュリティを行に

このアプローチは、MVCことによって、ブックが、アクションで同じセキュリティの概念を実装するよりもIMO安全で優れていないことがあります。

  • それは外で使用することができますボックス管理者・ジェネレータ・モジュール
  • 私が気づいていないんだ

答えて

0

今、私は、ユーザー認証の周りに他の問題を修正した後、問題を再現することができないとして、この質問はまぐれだったことが表示されます。

0

のみスーパー管理者のアクセス、それは時々どの資格情報を必要としないかもしれないどこか

  • それを実装するために忘れることは非常に困難です(私はそこにあるとは思わない)しかし、あなたができるなら、あなたはモデルにユーザーオブジェクトを渡すべきです。

  • +0

    私の質問は、なぜそれがほとんどのアクションで動作するのですが、バリデータではないと思いますか? – jdog

    0

    ここで何か不足していると思いますが、MVCレイヤーがかなり混ざっています。私の提案は、モデルをコントローラから独立させることです(コントローラにコンテキスト固有の状況を委譲します)。また、コントローラが検証を行う必要があります(要求を受け取り、フォームをバインドして検証するアクションが必要です)。そこには、あなたが文脈を明確にしなければならない場所があります)。 createQueryForAdministrator、およびcreateQueryForMembershipDelegate:

    1. OrganisationTableクラスには2つの方法を持っている必要があります。ここで私はどうなるのかです。それぞれが、それが何をすべきことを行い、そして今、あなたのような何かコントローラ(それを取り扱うアクション)を変更して実行する必要があります。フォームは、ユーザーの資格情報をチェックして行う必要がありますインスタンス

      public function executeAction(sfWebRequest $request) 
      { 
          if ($this->getUser()->hasCredential('administrator')) 
          { 
          //call the administrator method 
          } else { 
          //call the other method 
          } 
      } 
      
    2. アクションを以下のようなもの:

      If ($user->hasCredential("administrator")) 
      { 
          sfContext::getInstance()->getConfiguration()->loadHelper("Url"); 
          $form->getValidator("organization_id")->setOption("url",url_for("@action")); 
          [..] 
      } else { 
          [..] 
      } 
      

    url helper referenceをチェックし、あなたが行うことができ、アクションなどにヘルパーをロードしますが、あまりにも独自のヘルパーを作成することができますように考えています。お役に立てれば!

    EDITED:この記事をチェックしてくださいについてsfContext class and alternatives

    +0

    UrlHelperに関する情報をありがとう、ここで私の知識を深める必要がある。私はこのアクセス制御の概念を選んだ理由を説明するために質問を更新しました – jdog

    関連する問題