今回したいこと
今回したいことは、「あるユーザーが所属しているRoleのリストがほしい」ということ。
(Roleにグルーピングした際、Role所属ユーザー一覧は取れるが、ユーザーがどのRoleに所属しているか取るのが簡単にできない。全部のRoleに該当のユーザーがいるか見るという恐ろしいことが必要そう)
そのため、Userのaclに所属ロールを登録することで、ロールリストを取れるのではないか、という考え方。ロールリストが取れた後、ロールに所属している人のオブジェクト情報を取れるか確認。これができればグルーピング機能としては調査完了。
パーミッションって何?
そもそもパーミッションって複数つけられるの?
つけれました。コンソールからでもプログラムからでも。JS的には以下を参照。
NCMBの参考ページ:アクセス権限設定
メソッドとかの元となるrole.js
それで読み込みをする際にはどういう挙動なのか?
例:
ユーザーA:自分の会員権限のみ ←NCMBでのUSERでのデフォルト
ユーザーB:ロールA
ユーザーC:全体
ユーザーD:ロールAとロールB
ユーザーE:ロールAと全体
予想
ユーザーAでNCMB.User.fetchAll()
→結果:A/C/E
ユーザーBでNCMB.User.fetchAll()
→結果:全員
ユーザーCでNCMB.User.fetchAll()
→結果C/E
ユーザーDでNCMB.User.fetchAll()
→B/C/D/E
ユーザーEでNCMB.User.fetchAll()
→B/C/D/E
結果
自分とCとEしか見れない。(同じロールの人の情報がみれず、[全体]ロールしか取得できない)
→Roleでの絞り込みが必要なのだろうか?そしたらロール毎回書かないといけないからちょっとめんどいな。
いったんデフォルトUser新規作成時のaclは全体にしないと全員が見れないから微妙。全員が見れるレコードにしておき、データ取得の際にaclを見るようにして、その際にrole絞りで、グルーピングでのデータ取得をする使い方なのかな?
次の予想
ユーザーAのacl取得 NCMB.acl.get(read,userインスタンス)
→A
RoleAでNCMB.Role.fetchAll()
.then(function(result){
result.fetchUser();
})
.then(function(user){
user情報が取得;
})
ッて感じでいいのかな。
明日ソースを書いて確認してみる(未確認さーせん)
そもそも勘違いしているかもしれない。aclとRoleってなにかを整理するのが先かも
- Role:役、役割、任務、役目、本務
- acl:Access control list((NCMB/アクセス権限設定)の記事的には「アクセス権限」となっている
- permission:許可、許諾、認可、許し、(…が)許可
つまり、Roleは「役割」でしかなくて、aclが「アクセスに関する制御情報」をもっている。
Roleで権限を整理しようとしたのが誤っている気がしてきた。(Role別に権限を付与してあげることもできるってだけだった。)
ということでaclを整理する
まずはuserのみ
上記を元に、「ユーザーをキーにしてアクセス権限が付与される」のではないかと推測した。次の2パターンのうちどちらかだと思われる。
1.自分のaclに他の人の権限を付与して見れるようにする(自分→相手の発想)
2.相手が自分をaclに入ってると見れる(相手が許可するの発想)
結論「2.」だった。まあpermissionなんだから当然かと(許可をするというのが普通の感覚なのかと)。例にする。
Aユーザー:permissionは自分だけ
Bユーザー:permissionはAユーザーと自分
Cユーザー:permissionはAユーザーだけ
AユーザーでUSERをfetchAllすると、A,B,Cがとれる
BユーザーでUSERをfetchAllすると、Bだけがとれる
CユーザーでUSERをfetchAllすると、とれない
→つまり、permissionっていうのは「他のどの人からのアクセスを許可するか」ということであるみたい。
(もしかしたらふつうのコトかもしれないが自分には非常にしっくりきた難しいことでした)
Roleはどうなる?
Roleはちょっと複雑だけど、文章にするとこんな感じ。
「レコードのaclで、パーミッションとしてRoleを付与すると、そのRoleクラスのbelongUserフィールドにふくまれるユーザーからのアクセスを許可することとなる」
Userクラスにある、「アクセスする側の人」のaclに同じRoleが必要なのかと思ってたのだが、それが大きな勘違いで自分の理解を阻害していた。結局aclは「他からのアクセス許可」でしかない。つまり私はこんな勘違いをしていた。「自分が誰にアクセスできるかを定義できるものがあるはず」と。そうではなく、あるのは「他の人からのアクセスを許可するかどうか」しかないので、それの集積で権限が決まるようだ。
ということで、roleに所属させて、かつそのroleから見れるようにaclをいじれば、そのレコードを見れるようになる。
ということで会員がグループを作れるようにするためには
roleクラスにレコードを作りつつ、そのレコードに所属している人のaclにそのRoleからのアクセス許可として、パーミッションを付与してあげればOK。ソース的なのは明日。