
言語 🇯🇵 日本語
背景
実装
アクセス制御とは? 
With FastComments の SSO アクセス制御、しばしば RBAC とも呼ばれる機能を使うと、ユーザーを特定のページやコメントスレッドのみにアクセスできるよう制限できます。さらに、ユーザー同士は同じグループ内でのみ @mention できます。
詳細
私たちは Users と、オプションで Pages をグループに割り当てることができます。
Users がグループに割り当てられ、ウィジェット設定で Limit Comments by SSO User Groups が有効になっている場合、ユーザーは同じグループにいるユーザーのコメントのみ表示でき、同じグループ内のユーザーにしか @mention できなくなります。
さらに、Pages をグループに割り当てることもでき、その場合ユーザーはアクセス権のあるページのコメントにのみアクセスできます。
これを "User-Level" グループと "Page-Level" グループと呼びます。
では、どちらがあなたに適していますか?
Use User-Level Groups if...
- 同じ
urlId値(ページ URL または記事 ID)を使用しつつ、グループごとにコメントを制限したい場合。 - 例えば、「New User」と「Veteran User」グループを設け、同じページ上で互いのコメントを決して見られないようにしたい場合。
Use Page-Level Groups if...
- グループが特定のページに紐づいている場合。
- 例えば、「Public Pages」グループのユーザーは「Top Secret」記事を決して閲覧できないようにしたい場合。
仕組み 
FastComments のアクセス制御は、Pages と Users を目的のグループに割り当てることで機能します。
グループは単純に文字列識別子で、GREEN や abc-123 のようなものです。
Users と Pages は 1 つのグループに限定されません。制限はそれぞれ 100 と 1000 のグループです。
許可されていないページへのアクセス
ユーザーがアクセス権のないページにアクセスしようとすると、以下のようなエラーメッセージが表示されます:
メッセージテキストはカスタマイズできます。
仕様 
複数のユーザーがどのように相互作用するかを定義し、それをテストするのは複雑です。アクセス制御のために私たちが従う以下の仕様は、 実装をテストするために使用できます:
Page with null group ids, user with null group ids - should have access.
Page with null group ids, user with group ids - should have access.
Page with group ids, user with null group ids - should have access.
Page with group ids, user with empty list - should NOT have access.
Page with group ids, user with group ids - intersection exists - should have access.
Page with group ids, user with group ids - intersection does not exist - should NOT have access.
Page with empty list of group ids (nobody has access), user with null - should NOT have access.
SSO User A = group idsが定義されていない (null = フルアクセス).
SSO User B = group idsが定義されていない (null = フルアクセス).
Aは@Bできる.
SSO User A = group idsが定義されていない (null = フルアクセス).
SSO User B = Group ids defined.
Aは@Bできる.
SSO User A = Group ids defined.
SSO User B = group idsが定義されていない (null = フルアクセス).
Aは@Bできる.
SSO User A = Group ids = [a].
SSO User B = Group ids = [b].
Aは@Bできない.
SSO User A = Group ids = [a].
SSO User B = Group ids = [a, b].
Aは@Bできる.
実装 
別グループのユーザーへのメンション
もし2人のユーザーがそれぞれ異なるグループの集合に属しており、交差がない場合、互いに@mentionすることはできません。
ユーザーが手動で@mentionを入力してコメントを送信した場合、それはプレーンテキストのまま残ります。相手のユーザーはタグ付けされません。
グループの管理
GroupsはそれぞれPagesおよびSSOUsers API リソースを使用して定義されます。
Pages API はページにアクセスできるグループの集合を定義するために呼び出すことができます。デフォルトでは、すべてのグループとグループに属していないユーザーにもアクセス権があります。
同様に、SSOUsers API は各ユーザーに関連付けられたグループを定義するために呼び出すことができます。
両方のリソースについて、グループを設定または更新するタイミングに制限はありません。
ユーザー同士の@mentionのみを制限したい場合、Pages を考慮する必要はありません。
注意!
SSOユーザーグループの定義と更新は API を使用する必要はなく、代わりにコメントウィジェットに渡される SSO ペイロード内でグループ ID を定義することで自動的に更新できます。ただし、グループのリストが大きい場合は、ユーザーが各ページ読み込みごとにこのペイロードを送信する必要があるため推奨されません。
API呼び出しの例 
ここでは FastComments API を呼び出してアクセス制御を設定する方法を説明します。
始める前に、Group 構造を明示的に作成する必要はないことに注意してください。Groups は単に Users と Pages に追加される識別子です。ユーザーやページにグループを追加すると、そのグループは自動的に「作成」されます。
まず、User A と User B の2人のユーザーを作成します。最初は両方とも Group X に入れます:


次に Page を作成します。これを Confidential Page と呼びます。現時点ではこれらのユーザーは誰もこのページにアクセスできません。なぜならこのページは CONFIDENTIAL グループに属しているからです:

User A と User B は現時点で新しいページに アクセスできません。しかし、両者は同じグループ GROUP-X にいるため、お互いを @mention することはできます。
User B を更新して、ページにアクセスできるようにしましょう:

User B は現在両方のグループに属しています。ユーザー同士は引き続き @mention できますが、閲覧できるのは User B だけです。
User B が機密ページのみ閲覧できるようにしましょう:

これで User B は機密ページを閲覧できますが、両ユーザーは異なるグループにいるため互いに @mention することはできません。
しかし、アクセス制御の一部でないユーザーはページにアクセスできてしまいます。これを防ぐには、SSO ユーザーの groupIds が null に設定されていないことを確認してください。例えば、すべてにアクセスできる User C を作成してみます:

groupIds を null に設定すると、そのユーザーはアクセス制御の制限を受けないことを示します。
次に、全員がアクセスできるページを作成します:

accessibleByGroupIds を null に設定すると、この Page はアクセス制御の対象外となり、両方のユーザーがアクセスできるようになります。
これでアクセス制御のための API 実演は完了です。