2010-11-18 10 views
1

私はsymfonyプロジェクトを持っており、コミュニティ機能を追加したいと考えています。sfguardの高度な/動的なアクセス許可 - symfony

誰もが管理者としてコミュニティを開き、コミュニティに参加するように招待します。

管理者には、一般のコミュニティユーザーよりも多くのアクセス許可があります。

事は、私は、ユーザーSyfonyのsfguarduserにしたい、され、sfguardgroup、sfguardpermission

  1. それはその目的のためにsfguardアーキテクチャを使用するために、任意の意味を成していますか?
  2. 特定のユーザーが特定のグループに対して特定の権限を持っているかどうかを確認するにはどうすればよいですか?

答えて

3

ねえ、これはあなたに少しを助ける;)アクションインサイド

class myAccountActions extends sfActions 
{ 
    public function executeDoThingsWithCredentials() 
    { 
    $user = $this->getUser(); 

    // Check if the user has a credential 
    echo $user->hasCredential('foo');      => true 

    // Check if the user has both credentials 
    echo $user->hasCredential(array('foo', 'bar'));  => true 

    // Check if the user has one of the credentials 
    echo $user->hasCredential(array('foo', 'bar'), false); => true 

    // Remove a credential 
    $user->removeCredential('foo'); 
    echo $user->hasCredential('foo');      => false 

    // Remove all credentials (useful in the logout process) 
    $user->clearCredentials(); 
    echo $user->hasCredential('bar');      => false 
    } 
} 

層内部:

 <?php if ($sf_user->hasCredential('section3')): ?> 
    .... 
    <?php endif; ?> 

あなたは加えて使用して検討するかもしれない:

if($user->hasGroup('SOME_GROUP')) 

出典:Symfony inside the layer

+0

ありがとうございました。私はまだ1つのことを得ていませんでした - 特定のグループの許可を確認するにはどうすればいいですか? (C ')) – Yos

+0

の場合:$ this-> getUser() - > hasCertential(' B ')&& $ this-> getUserユーザーがコミュニティCの管理者であっても、コミュニティDの通常のユーザーの場合はどうなりますか?あなたのコードには、「ユーザーCはグループCに資格Bを持っていますか?」というような条件はありません。 –

+0

はい(C)の場合、ユーザーAはグループBに許可タイプBを持っていますか? – Yos

2

それはその目的のためにsfguardアーキテクチャを使用するために、任意の意味を成していますか?

もちろん、少し修正する必要があります。デフォルトでは、Symfonyはセッションに資格情報を保存します。つまり、セッションが終了するまで無効になりません。これは、グループに誰かを追加したり、許可を与えたりすることで、すぐに効果が現れることが予想される場合、大きな問題です。あなたは、次のいずれかを実行することをお勧めします。この問題を解決するには

、:

  • すべてのリクエストに応じてではなく、サインインの資格情報をロード
  • ユーザーの資格情報を変更すると、どちらかそれらを無効にします。 APCのグローバルキャッシュ設定(あなたはAPCを使用していますか?)またはユーザーのプロファイルの設定を使用します。

いずれにしても、SymfonyとsfGuardDoctrineのユーザシステムに精通している必要があります。 sfGuardSecurityUser::signInを見て、デフォルトで資格情報がどのように機能するかを理解しています。

特定のユーザーが特定のグループに対して特定の権限を持っているかどうかを確認するにはどうすればよいですか?

トリスタンがこれをかなり徹底的にカバーしました。 sfDoctrineGuard readmeもご覧ください。サインインしたユーザーの資格情報の変更が実際に発生するすべてのソリューションでは、Tristanに記載されている一部の無効化を実行する方法のすべてではないにしても、ほとんどをオーバーライドする必要があります。

さらに、this related questionをチェックしてください。役立つかもしれません。

関連する問題