【问题标题】:advanced / dynamic permissions on sfguard - symfonysfguard 上的高级/动态权限 - symfony
【发布时间】:2010-11-18 00:04:38
【问题描述】:

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

每个人都可以以管理员身份打开社区并邀请人们加入社区。​​p>

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

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

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

【问题讨论】:

    标签: php permissions symfony1 sfguard


    【解决方案1】:

    嘿,这对你有一点帮助;)

    动作内部:

      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

    【讨论】:

    • 谢谢。我仍然没有得到一件事 - 我如何检查特定组的权限? like - 用户 A 在组 C 上是否具有权限类型 B。
    • if ($this->getUser()->hasCredential('B') && $this->getUser()->hasGroup('C'))
    • 是的,但是如果用户是社区 C 中的管理员,但社区 D 中的普通用户怎么办?在您的代码中,没有“用户 A 在组 C 上是否拥有凭据 B”之类的条件。
    【解决方案2】:

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

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

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

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

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

    如何检查特定用户是否对特定组具有特定权限?

    特里斯坦非常彻底地介绍了这一点。您还想看看sfDoctrineGuard readme。请注意,对于为登录用户实时更改凭据的任何解决方案,您需要覆盖 Tristan 列出的大多数(如果不是全部)方法以执行某种失效。

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

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多