2012-05-20 44 views
0

我在security.yml中確保操作。如果用戶擁有憑證(A和B)或(A和C),我希望用戶有權訪問。看看sparse docs我試過這些組合:帶有複雜AND/OR憑證的sfGuardPlugin

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:

我試圖簡單或組合從文檔複製:

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

同樣,沒有骰子。我發佈了一個bugreport:http://trac.symfony-project.org/ticket/10036

我會發布我的臨時解決方法作爲答案。多謝你們。

回答

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')); 
} 

該功能用來檢查行動的權限和模板隱藏無法訪問的菜單。希望它能幫助有同樣問題的人。

我仍然很高興聽到任何人與答案!

0

[A,[B,C]]變爲(A AND(B OR C))

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

即等於 [A,[B,C]]

我需要(A和(B或C或d))

我確實[A,[B,C,d]]

這對我有效。

請記住!!

每次添加一個新的方括號時,邏輯在AND和OR之間交換。所以,你可以創建非常複雜的證書組合,比如這個:

憑據:[根,[供應商,[所有者,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

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()的調用,但我們不知道你在用戶上設置了什麼憑證,所以我們不知道該在那裏檢查什麼。