sfguard上的高级/动态权限 - symfony

时间:2010-11-18 00:04:39

标签: php permissions symfony1 sfguard

我有一个symfony项目,想要添加社区功能。

每个人都可以作为管理员开放社区,并邀请人们加入社区。

管理员拥有的权限多于普通社区用户。

问题是,我想使用Syfony的sfguarduser,sfguardgroup,sfguardpermission

  1. 为此目的使用sfguard架构是否有意义?
  2. 如何检查特定用户是否拥有特定群组的特定权限?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

为此目的使用sfguard架构是否有意义?

当然,但你需要稍微解决一下。默认情况下,Symfony会在会话中存储凭据,这意味着在会话到期之前它们不会失效。如果您希望通过向某个群组添加某人或授予他们权限来立即生效,这是一个大问题。

要解决此问题,您需要执行以下操作之一:

  • 在每个请求上加载凭据,而不是登录。
  • 当用户的凭据更改时,通过APC中的全局缓存设置(您正在使用APC,对吗?)或用户配置文件上的设置使它们无效。

无论哪种方式,您都必须熟悉Symfony和sfGuardDoctrine用户系统。请查看sfGuardSecurityUser::signIn,以便您熟悉默认情况下凭据的工作方式。

如何检查特定用户是否拥有特定群组的特定权限?

特里斯坦对此非常透彻。您还需要查看sfDoctrineGuard readme。请注意,对于签名用户的实时更改凭据更改的任何解决方案,您需要覆盖Tristan列出的大多数(如果不是全部)方法以执行某种失效。

另外,请查看this related question,这可能会有帮助。