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 $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

それによると、上記の3回目の試行[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

他のことに移る必要があるので、この問題の回避策をここに投稿します。

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

この関数は、アクションの権限を確認したり、テンプレートでアクセスできないメニューを非表示にしたりするために使用されます。同じ問題を抱えている人に役立つことを願っています。

本当の答えを持っている人から聞いてうれしいです!

于 2012-05-21T20:28:48.657 に答える
0

http://www.symfony-project.org/jobeet/1_4/Propel/en/13の複雑な資格情報のチュートリアルに従いましたか?

于 2012-05-20T23:03:15.117 に答える
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 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

あなたのコード例は少し離れすぎていると思います。資格情報の設定と確認方法の例も提供できますか? 問題は定義自体ではなく、そこにある可能性があります。(また、セキュリティフィルターはfilters.yml何ですか?「機能しない」とは正確にはどういう意味ですか)

最初のスニペットでは、オプション 2 と 3 で期待どおりの結果が得られます。そのため、実行しようとしているユーザーmyactionは、認証済みで資格情報を持っている場合にのみ実行が許可されますA and (B or C)。そうしないと、デフォルトのログインまたはセキュア アクションに送られます。

テスト コードには、間違った結果につながるエラーがあります。

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

hasCredential()は、資格情報または資格情報の配列を最初のパラメーターとして受け入れ、ブール値を 2 番目のパラメーターとして受け入れます。2 つの文字列資格情報を渡します。

作成したテストの例を示すたびに、得られた結果と期待する結果についての情報を提供してください。これは、問題を特定するのに役立ちます。

3 番目の例では、呼び出しを作成しhasCredentials()ますが、ユーザーに設定した資格情報がわからないため、そこで何を確認すればよいかわかりません。

于 2013-02-19T14:24:47.723 に答える