0

我在 security.yml 中保护一个动作。如果用户具有凭据(A 和 B)或(A 和 C),我希望用户能够访问。查看相当稀疏的文档,我尝试了这些组合:

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)

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

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

4

4 回答 4

0

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

在第一个片段中,选项 2 和 3 将给出您期望的结果。因此,任何试图执行的用户myaction只有在他被 Authenticated 并且拥有凭据时才被允许这样做A and (B or C)。否则,他将被发送到默认登录或安全操作。

在测试代​​码中有一个错误导致错误的结果:

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

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

每次你给出你所做的测试的例子时,都会给出你得到的结果是什么以及你期望的结果应该是什么的信息。这将有助于识别问题。

在第三个示例中,您编写了一个调用,hasCredentials()但我们不知道您为用户设置了哪些凭据,因此我们不知道在那里检查什么。

于 2013-02-19T14:24:47.723 回答
0

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

所以如果你需要 ((A AND B) OR (A AND C))

即等于 [A,[B,c]]

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

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

这对我有用。

记住!!

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

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

          # 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

于 2013-02-19T12:44:01.120 回答
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/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'));
}

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

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

于 2012-05-21T20:28:48.657 回答
0

您是否遵循此处的复杂凭证教程:http ://www.symfony-project.org/jobeet/1_4/Propel/en/13 ?

于 2012-05-20T23:03:15.117 回答