私は自分でこの答えを見つけようとしてきましたが、それにはあまりにも悪いので、あなたが私を助けてくれることを願ってここに来ました.
次のデータベース テーブルがあります。
user(
int unsigned id,
varchar login
)
group(
int unsigned id,
varchar label
)
right(
int unsigned id,
varchar label
)
user_group(
int unsigned userId,
int unsigned groupId
)
user_right(
int unsigned userId,
int unsigned rightId,
boolean granted
)
group_right(
int unsigned groupId,
int unsigned rightId,
boolean granted
)
および 3 つの構成パラメーター (PHP が定義) :
GRANTED_BY_DEFAULT
TRUE
またはにすることができますFALSE
。グループまたはユーザーに対して権限が指定されていない (関連付けテーブルにない) 場合に、権限が付与されているかどうかを示します。RESULTING_RIGHTS
MIN_RIGHTS
またはにすることができますMAX_RIGHTS
。結果として生じる権利を決定する際に、「AND」または「OR」演算子を使用するかどうかを示します。たとえば、権限 "r1" に対して、グループ "g1" が TRUE で、グループ "g2" と "g3" が FALSE の場合、"MIN_RIGHTS" で FALSE、"MAX_RIGHTS" で TRUE になります。RIGHTS_PRIORITY
USER_OVER_GROUP
またはにすることができますGROUP_OVER_USER
。ユーザー自身の権限がグループの権限をオーバーライドするか、グループの権限がユーザー自身の権限をオーバーライドするかを示します。
これらの 3 つのパラメーターとそのグループを考慮して、ユーザーが実際に持っている権利を見つける単一のクエリを作成したいと思いますが、その方法については本当にわかりません。複数のクエリを作成し、PHP 側で作業の一部を行うこともできますが、AJAX オートコンプリートやその他のものに対してアプリを十分に高速にしたいので、多くのクエリを実行する必要は避けたいと思います。
誰も私を助けたくない、または時間がない場合は理解できます:p読んでくれてありがとう。
EDIT:いくつかのサンプルデータ:
user (id, login) :
1 "Admin"
group (id, label) :
1 "g1"
2 "g2"
3 "g3"
right (id, label) :
1 "r1"
2 "r2"
3 "r3"
user_group (userId, groupId) :
1 1
1 2
user_right (userId, rightId) :
1 1 true
1 2 false
group_rights (groupId, rightId) :
1 1 true
1 2 false
2 1 false
2 3 true
出力は、パラメーターと他のテーブルの行に応じて (right_id, right_label) 行のリストになります。
ユーザー ID および / またはログインは、権限を取得する際に既知のものと見なされます。