我在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>
我没有到达任何地方。
据此,我在[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
我将在此发布我的临时解决方案作为答案。谢谢你们。
答案 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()
的电话,但我们不知道您为用户设置了哪些凭据,因此我们不知道该在哪里查看。