8

私はこれを何度か試みましたが、うまくいきませんでした。この投稿を読んだ後、これをもう一度やりたいと思いました。では、なぜ次のことがうまくいかないのか誰か教えてもらえますか?

<?php

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if( $user == ($editor | $admin) ) {
    echo "Test";    
}

?>
4

10 に答える 10

11

ビットごとの OR 演算子 (|) を使用してビットを設定し、AND 演算子 (&) を使用してビットをチェックします。コードは次のようになります。

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( $user & ($editor | $admin) ) {
        echo "Test";    
    }

?>

バイナリと、ビットごとの演算子が何をするかを正確に理解していない場合は、それを学ぶ必要があります。これを行う方法をよりよく理解できます。

于 2008-08-19T23:17:43.110 に答える
6

車輪の再発明を避けるために、Zend ACLZend Authなどの ACL/認証システムを調べてみませんか? どちらも Zend Framework 全体から独立して使用できます。アクセス制御は扱いにくい状況であるため、少なくとも他のシステムがどのようにそれを行っているかを調べることは有益です。

于 2008-08-20T02:39:00.863 に答える
2

PHP を使用してから長い時間が経ちましたが、これでうまくいくと思います。

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( ($user == $editor) || ($user == $admin) ) {
        echo "Test";    
    }

?>
于 2008-08-19T23:14:35.673 に答える
2

これをエラー報告で使用しましたが、非常にうまく機能します。ユーザー権限に関しては、非常にうまく機能するはずです。データベースのユーザー権限ごとに複数の列を作成することも、データベースにユーザーレベルの列を 1 つ作成することもできます。このオプションを選択してください。

于 2008-08-25T16:57:32.553 に答える
1

(2 | 4) は 6 に評価されますが、2 == 6 は false です。

于 2008-08-19T23:18:18.210 に答える
1

@mk: (2 | 4) は 6 に評価されます。

于 2008-08-19T23:24:22.483 に答える
1
$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if (user == $editor || $user == $admin) {
    echo "Test";
}
于 2008-08-19T23:26:13.570 に答える
1

すばらしい、これは CMS でパーミッションを行う最良の方法のようです。はい?いいえ?

たぶん、私は実際にそのようにしたことはありません。私が行ったことは、ビットごとの演算子を使用して、データベース内の単一の列の単一の数値に一連の「はいまたはいいえ」の設定を格納することです。

アクセス許可については、データベースにアクセス許可を保存する場合、この方法がうまくいくと思います。誰かがコンテンツを投稿したくて、それを管理者と編集者だけに見せたい場合は、次の結果を保存するだけです。

 ($editor | $admin)

データベースに入れ、それをチェックするには、次のようにします

 if ($user & $database_row['permissions']) {
       // display content
 } else {
       // display permissions error
 }
于 2008-08-19T23:39:48.280 に答える
0

それは常にあなたが必要とするものに依存します。Zend Framework を既に知っている場合は、以前に作成された Zend_Acl/_Auth の提案を支持します。ただし、すべてのフレームワークにはおそらく同様のコンポーネントが付属していることに注意してください。

他に頭に浮かぶのはLiveUserです。私もそれを扱うのがとても好きです。

あなたはほとんど何でもできると思います。あなたのアプローチは非常に単純に見えますが、(これらすべての if() を介して) アプリケーションの真ん中に多くの ACL ロジックを配置することになるため、制限もあります。シンプルで拡張性を保つためには、これは最善の方法ではありません。;)

于 2008-08-25T16:52:11.630 に答える
0

私の意見では、これはうまくスケーリングしません。私は実際に大規模なプロジェクトでそれを使用しようとしたことはありませんが、CMS でこれを使用するのは複雑に思えます。

于 2008-08-19T23:42:09.353 に答える