などのコンパレータを使用する
if (admin) {do x}
else if (user) {do y}
柔軟性がなく、うまくスケーリングできないため、悪い考えです。
いくつかのオプションがあります。権限が階層的である場合、つまり、1 人のユーザーがすべてを実行でき、下位のユーザーは上位のユーザーよりも権限が少ないことを意味します。
admin - 1, 2, 3
accountant - 1, 2
user - 1
次に、数字を与えて言うことができます
if (permissionValue => 500)
{
action2();
}
そして、テーブルを用意してください:
admin 1000
accountant 500
user 250
これにより、管理者と経理担当者の間に新しいユーザー タイプ (モデレーターなど) を追加できますが、次の場合は機能しません。
admin 1, 2, 3
accountant 1, 2
moderator 1, 3
user 1
モデレーターと経理担当者の権限は同じレベルにあるためです。
最良の解決策は、ビット単位の演算子を使用し、バイナリ値を保護領域に割り当てることです。
ユーザーがコンテンツを読み取ることができ、モデレーターがコンテンツを読み書きでき、管理者がコンテンツを読み書きおよび削除できるという簡単な例を考えてみましょう。次の表が得られます (値はビットごとの or 演算子を使用して構築されます)
Users: Read Write Delete
admin: 7 - (0b001 | 0b010 | 0b100) = 0b111 = 7
moderator: 3 - (0b001 | 0b010 | NO ) = 0b011 = 3
user: 1 - (0b001 | NO | NO ) = 0b001 = 1
その後、次のことができます。
//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);
if ($userPermissions & READ)
{
//Allowed to Read
}
if ($userPermissions & WRITE)
{
//Show write form
}
これらはビット演算子の例です。これは、x にビット y が含まれている場合に true を返すことを意味します。書き込み機能について
User Permission
User Write
1 & 2
0b001 & 0b010 -- returns false
Admin Write
7 & 2
0b111 & 0b010 -- returns true
最初の例では、0b001 にはビット 0b010 が含まれていないため、false が返されます。0b111 にはビット 0b010 が含まれており、true を返します。
詳細はこちら