KiiObject の ACL のカスタマイズ
KiiObject の ACL を設定することにより、Bucket 内の KiiObject それぞれに対するアクセス権を変更できます。
KiiObject の ACL エントリー
KiiObject の ACL エントリーに指定可能な項目は以下のとおりです。
アクション(アクセス制御)
対象のユーザー/グループ/Thing が「何をできるか」を指定します。
アクション コードでの指定 ※ 対象ユーザー/グループ/Thing ができること READ_EXISTING_OBJECT READ_EXISTING_OBJECT
KiiObject の読み取り。 WRITE_EXISTING_OBJECT WRITE_EXISTING_OBJECT
KiiObject の更新と削除。 ※ これらのシンボルは、列挙型
ObjectAction
で定義されています。KiiACL.ObjectAction.READ_EXISTING_OBJECT
のように指定できます。注意:Bucket のアクションである READ_OBJECTS_IN_BUCKET アクションが許可されているサブジェクトは、READ_EXISTING_OBJECT アクションを許可されているかどうかにかかわらず、Bucket 内の全ての KiiObject を無条件で読み取れます。動作例は ACL の変更の例 を参照してください。
サブジェクト(対象)
「誰が」実行できるようになるかを指定します。
サブジェクト 誰が実行可能か KiiUser インスタンス 指定されたユーザー。 KiiGroup インスタンス 指定されたグループのメンバー。 KiiThing インスタンス 指定された Thing。 KiiAnyAuthenticatedUser ログイン済みの全ユーザー。 KiiAnonymousUser 匿名ユーザー。 ログイン済みの全ユーザーと匿名ユーザーの定義については、サブジェクト をご覧ください。
KiiObject の ACL の管理
KiiObject の ACL にエントリーを追加または削除できます。ACL エントリーの一覧を取得することもできます。
KiiObject に ACL エントリーを追加する
ACL エントリーを KiiObject に追加する例として、READ_EXISTING_OBJECT
アクションを KiiAnyAuthenticatedUser
に許可するサンプルコードを示します。
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL acl = object.acl(); // Set an ACL entry to the ACL. acl.putACLEntry(new KiiACLEntry(KiiAnyAuthenticatedUser.create(), KiiACL.ObjectAction.READ_EXISTING_OBJECT, true)); try { // Save the ACL to the server. acl.save(); } catch (ACLOperationException e) { // Handle the error. }
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL acl = object.acl(); // Set an ACL entry to the ACL. acl.putACLEntry(new KiiACLEntry(KiiAnyAuthenticatedUser.create(), KiiACL.ObjectAction.READ_EXISTING_OBJECT, true)); // Save the ACL to the server. acl.save(new KiiACLCallBack() { @Override public void onSaveCompleted(int token, KiiACL acl, Exception exception) { if (exception != null) { // Handle the error. return; } } });
acl()
メソッドをコールしてKiiACL
のインスタンスを生成します。KiiACLEntry
を生成して、putACLEntry()
メソッドの引数として渡します。この例ではKiiAnyAuthenticatedUser
インスタンスをサブジェクトとして設定し、ログイン済みの全ユーザーにアクセス権限を与えています。同様にKiiAnonymousUser
を指定すれば匿名ユーザーに、特定の KiiUser を指定すれば、そのユーザーにアクセス権限を付与できます。save()
メソッドをコールして ACL の変更要求を Kii Cloud に送信します。
ACL エントリーにユーザーやグループなど、他のサブジェクトを指定する方法の詳細は KiiACLEntry を参照してください。
複数の ACL エントリーを追加する場合、SDK はそれらを 1 件ずつ処理するため、一部の ACL エントリーの処理が失敗する可能性があります。ACL の設定に失敗したときは、ACLOperationException
の getFailedACLEntries()
メソッドを使うと、追加されなかった ACL エントリーの一覧を取得できます。
KiiObject の ACL エントリーを削除する
設定されている ACL エントリーを削除するには、KiiACLEntry
の第 3 引数 grant
を false にしたエントリーを作成して保存します。サーバー上の ACL から指定した ACL エントリーが削除されます。
以下は、上のサンプルコードによって作成された ACL エントリーを削除する例です。
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL objectAcl = object.acl(); // Delete the ACL entry from the ACL. objectAcl.putACLEntry(new KiiACLEntry(KiiAnyAuthenticatedUser.create(), KiiACL.ObjectAction.READ_EXISTING_OBJECT, false)); try { // Save the ACL to the server. objectAcl.save(); } catch (ACLOperationException e) { // Handle the error. }
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL objectAcl = object.acl(); // Delete the ACL entry from the ACL. objectAcl.putACLEntry(new KiiACLEntry(KiiAnyAuthenticatedUser.create(), KiiACL.ObjectAction.READ_EXISTING_OBJECT, false)); // Save the ACL to the server. objectAcl.save(new KiiACLCallBack() { @Override public void onSaveCompleted(int token, KiiACL acl, Exception exception) { if (exception != null) { // Handle the error. return; } } });
KiiACL
の removeACLEntry()
メソッドは、クライアント側で準備中の 「ACL の 変更リスト」のエントリーを削除するもので、サーバー上の ACL エントリーを削除するものではない点にご注意ください。上記のコードでは、クライアント上の objectAcl
に対して READ_EXISTING_OBJECT
アクションを伴う ACL エントリーの削除要求を登録してから、save()
でサーバーに反映しています。removeACLEntry()
は、この ACL エントリーを変更リストから削除するためのもので、サーバー上の ACL を直接操作するためのものではありません。
KiiObject の ACL を取得する
KiiObject に設定されている ACL を取得できます。ACL エントリーを明示的に設定していない場合でも、デフォルトの ACL を取得することができます。
以下のように、ACL は ACL エントリーの Set として取得できます。
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL objectACL = object.acl(); try { // Get the ACL entries from the server. Set<KiiACLEntry> list = objectACL.listACLEntries(); for (KiiACLEntry entry : list) { KiiACL.Action action = entry.getAction(); KiiSubject subject = entry.getSubject(); // Check the ACL entry. } } catch (ACLOperationException e) { // Handle the error. }
-
// Instantiate a KiiObject. Uri objUri = Uri.parse("Set the URI of an existing KiiObject here"); KiiObject object = KiiObject.createByUri(objUri); // Instantiate the ACL of the KiiObject. KiiACL objectACL = object.acl(); // Get the ACL entries from the server. objectACL.listACLEntries(new KiiACLCallBack() { public void onListACLEntriesCompleted(int token, Set<KiiACLEntry> list, KiiACL acl, Exception exception) { if (exception != null) { // Handle the error. return; } for (KiiACLEntry entry : list) { KiiACL.Action action = entry.getAction(); KiiSubject subject = entry.getSubject(); // Check the ACL entry. } } });
acl()
メソッドをコールしてKiiACL
のインスタンスを生成します。listAclEntries()
メソッドをコールして、登録されている ACL をKiiACLEntry
の Set として取得します。- Set の各エントリーを確認することで目的の処理を実行します。
ACL 設定の際、設定済みの ACL エントリーをさらに追加しようとするとエラーとなります。ここに示す方法で ACL を事前にチェックすることによって、必要な ACL エントリーの変更差分を作成できます。
期待どおりに動作しない場合
複数回実行するとエラーになる
ACL エントリーは初期化処理等で 1 回だけ書き換え、次回の実行時には再設定しないような実装が必要です。
保存しようとしている ACL エントリーがすでに設定されていた場合、エラーになります。特に、同じ登録処理を複数回実行すると、登録しようとしている ACL エントリーがすでに存在することになるため、エラーになる点に注意が必要です。
なお、複数の ACL エントリーは 1 件ずつサーバーに反映するため、途中でエラーが発生すると不完全な形で ACL エントリーが保存されます。このような状況から回復するには、既存の ACL をサーバーから一旦取得し、重複している ACL エントリーを削除してから登録するような処理が必要です。取得方法の詳細は KiiObject の ACL を取得する をご覧ください。
ACL エントリーを削除できない
KiiObject 作成者やスコープオーナーにデフォルトで許可されるアクションの ACL エントリーは削除できません。詳細は スコープオーナーや作成者の ACL エントリーは削除できません をご覧ください。