带有复杂AND / OR凭据的sfGuardPlugin

时间:2012-05-20 22:54:23

标签: symfony-1.4 credentials sfguard

我在security.yml中确保了一个操作。如果用户有凭证(A和B)或(A和C),我希望用户有权访问。看着sparse docs而不是我尝试了这些组合:

myaction:
  credentials: [[A, B], [A, C]]
  credentials: [[[A, B], [A, C]]]
  credentials: [A, [B, C]]

它们都不起作用; [A, B]有效,但这只是战斗的一半。有没有人有这样的工作?

我正在使用Propel 1.4.2和sfActionCredentialsGetterPlugin。感谢您的投入。

修改

我在不使用sfActionCredentialsGetterPlugin的情况下进行了测试,只是在模板中直接使用php:

<?php $sf_user->addCredentials('A', 'C'); ?>
<?php var_dump($sf_user->getCredentials()->getRawValue()) ?><br><br><br>
<?php $cred_a = 'A'; ?>
<?php $cred_b = 'B'; ?>
<?php $cred_c = 'C'; ?>
<?php $cred_3 = array('B', 'C'); ?>
<?php $has_cred1 = $sf_user->hasCredential(array($cred_a, $cred_3)) ? 'true' : 'false' ?>
<?php $has_cred2 = $sf_user->hasCredential($cred_a, $cred_b) ? 'true' : 'false' ?>
<?php echo 'has cred1? '.$has_cred1 ?><br><br>
<?php echo 'has cred2? '.$has_cred2 ?><br><br>

我没有到达任何地方。

这里有更多信息:http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_sub_complex_credentials

据此,我在[A, [B, C]]以上的第三次尝试应该有效!

任何?

编辑2:

我尝试从文档中复制一个简单的OR组合:

// security.yml:
credentials: [[A, B]]
// template:
$sf_user->hasCredential(array('A', 'B'), false)

再次,没有骰子。我发布了一个bug报告:http://trac.symfony-project.org/ticket/10036

我将在此发布我的临时解决方案作为答案。谢谢你们。

4 个答案:

答案 0 :(得分:0)

您是否按照复杂凭据教程进行操作:http://www.symfony-project.org/jobeet/1_4/Propel/en/13

答案 1 :(得分:0)

我需要继续讨论其他事情,所以我在这里发布我的解决方法。

LIB / Tools.class.php:

// check if the user has any of the given credentials
// (need this because sf OR credential combo doesn't work)
// superadmins always pass this check
// param credentials:   (string) single credential, or
//                      (array) flat array of string credentials
public static function hasAnyCredential($user, $credentials)
{
    if ( !is_array($credentials) )
    {
        return $user->hasCredential($credentials);
    }
    else
    {
        $test = false;
        foreach ($credentials as $credential)
        {
            $test = false;
            if ( $user->hasCredential($credential) ) $test = true;
            if ( $test ) break;
        }
    }
    return $test;
}

应用/ MyModule的/动作/的actions.class.php:

// check if user has permissions B or C
// security.yml only has credentials: [A]
protected function hasBcPermission(myUser $user)
{
    return Tools::hasAnyCredential($user, array('B', 'C'));
}

此功能用于检查操作权限,并在模板中隐藏无法访问的菜单。希望它可以帮助有同样问题的人。

我仍然很高兴收到任何有真实答案的人的消息!

答案 2 :(得分:0)

[A,[B,C]]变为(A AND(B OR C))

所以如果你需要的话 ((A和B)或(A和C))

即。等于 [A,[B,C]]

我需要(A AND(B或C或D))

我做了[A,[B,C,D]]

这对我有用。

记住!!

每次添加新级别的方括号时,逻辑在AND和OR之间交换。因此,您可以创建非常复杂的凭据组合,例如:

凭据:[[root,[供应商,[所有者,quasiowner]],帐户]]

          # root OR (supplier AND (owner OR quasiowner)) OR accounts

另外,请不要忘记刷新凭据并检查您是否已分配到A和B或A和C

您可以在此处查看详细信息。 http://symfony.com/legacy/doc/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_sub_complex_credentials

答案 3 :(得分:0)

我害怕你的代码示例有点过于分离。您还可以提供有关如何设置和检查凭据的示例吗?问题可能出在那里而不是定义本身。 (还有filters.yml中的安全过滤器是什么,以及“它们不起作用”到底是什么意思?)

在第一个代码段中,选项2和3将提供您期望的结果。因此,只有在经过身份验证且具有凭据myaction的情况下,才允许任何尝试执行A and (B or C)的用户执行此操作。否则,他将被发送到默认登录或安全操作。

在测试代码中存在导致错误结果的错误:

<?php $has_cred2 = $sf_user->hasCredential($cred_a, $cred_b) ? 'true' : 'false' ?>

hasCredential()接受凭证或凭证数组作为第一个参数,布尔值作为第二个参数。您传递了两个字符串凭据。

每次您提供测试示例时,都会提供您获得的结果以及您期望的结果。这有助于发现问题。

在第三个示例中,您拨打了hasCredentials()的电话,但我们不知道您为用户设置了哪些凭据,因此我们不知道该在哪里查看。