3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Moodleのコンテキスト・ケイパビリティ・ロールについて

Posted at

##対象バージョン
Moodle 2.8

##ケイパビリティとコンテキスト
has_capability()の2番目の引数にコンテキストを渡す必要がある
その際のコンテキストは、$context = context_xxxx::instance();で生成する(古いバージョンだと記法が違う)

context_xxxxには、以下の6種類がある
context_system, context_user, context_coursecat, context_course, context_module, context_block

どのcontext_xxxxを使えばいいかは、チェックしたいケイパビリティの定義部分にある'contextlevel'の値が参考になる
→必ずここに書いてある値を使わなければならないわけではないが、とりあえずcontext_systemを使っておけ的な考えだと、本来はtrue(権限あり)なのにfalseが返ってきてしまうことがある

has_capability()は、デフォルトでは$USER->idのユーザのケイパビリティをチェックする
他のユーザのケイパビリティをチェックしたければ、3番目の引数を渡せばいい

・コアのケイパビリティはだいたいlib/db/access.phpの中に定義されている
・context_xxxx系クラスの定義はlib/accesslib.phpの中に存在する

##ロールとコンテキスト
https://docs.moodle.org/2x/ja/%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6
あるコンテキストに対してロールが割り当てられた場合、それより下のコンテキストに対して常にそのロールが適用される
 例:「マネージャ」というロールは、システムロールとして割り当てることもできるし、コース内でだけ割り当てることもできる
   「コース作成者」というロールは、その性質上システムロールとして割り当てることしかできない(コース内で割り当てても肝心のコース作成ができないので)

##has_capability
・has_capability()の中で、管理者だったら問答無用でtrue等の処理を行うが、
 そうでない場合はhas_capability_in_accessdata()を呼び出す
・has_capability_in_accessdata()の中で、渡されたコンテキストのpath情報を見て、
 どこかの階層でCAP_ALLOWされていたりCAP_PROHIBITされていないかを見てtrue/falseを返す
→context_systemを渡すと、システムコンテキストのレベルでしかケイパビリティの有無をチェックしないが、
 context_course, context_coursecat等を渡せば、コースやコースカテゴリのレベルでもケイパビリティの有無をチェックする
→つまり、context_systemを使ってしまうと「本来はtrueなのにfalseを返してしまう」可能性が高くなる?
 「本来はfalseなのにtrueを返してしまう」という心配は要らない?

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?