コンテキストは、ZendFramework上に構築された教育管理システムです。クライアントとのほぼすべてのデータ対話を処理するために、RESTfulMVCを実装しています。リソース間の関係は、外部キーなどを使用してデータベースにマッピングされます。
例:教師が特定の生徒に関するレポートを作成します。
現在、個々の役割のレベルに合わせて調整できる役割ベースの権限システムがあります(たとえば、teacher_5
役割名として使用)。したがって、既存のレポートへのアクセスを簡単に制限できます(たとえば、レポートを作成した講師の役割にのみレポートの編集/配置権限を許可する権限をレポートモデルで生成することにより)。問題は創造にあります。レポートを追加するために、ユーザーは/ reportsに投稿できます。たとえば、次のデータです。
{ achievement: "4", performance: "5", student_id: "10" }
問題は、チューターが新しいレポートを作成できるのはstudent_ids
、彼らが教えている学生の特定のサブセットのみであるということです。
1つのアプローチは、これをそのフィールドの検証の問題として扱うことです。これに関する問題は、間違いから身を守りたいということです。これは検証では簡単ではありません(コードは、特定のフィールドで特別な検証が必要であることを事前に知っている必要があります)。
もう1つは、パーミッションシステムを完全にきめ細かいものに拡張し(つまり、すべてのモデルのすべてのフィールドにパーミッションが存在する)、現在のパーミッションシステムを拡張して、パラメータ化されたパーミッションチェックに応答することです。したがって、現在のユーザーが作成に関するレポートにstudent_id 10を追加する権限を持っているかどうかを知りたい場合は、次のようになります。
if ($acl->isAllowed($resource, $role, $action, $field, $value))
ここで、$ resourceはレポートモデル、$ roleは教師teacher_5
、$action
「post」、$ fieldはstudent_id
、、$valueは10になります。aclクラスは基本的に$resource
それ自体への呼び出しを処理します。
どちらの方向に進むべきかはわかりませんが、おそらくこれはかなり一般的な問題であるため、他の人がどのようなアプローチを取っているのか疑問に思っています。