アクセスコントロールリスト (ACL) は、リソースへのアクセスを保護するデータ構造体です。java.security.acl パッケージは、このようなデータ構造体へのインタフェースを提供し、sun.security.acl パッケージは java.security.acl パッケージで指定したインタフェースのデフォルトの実装を提供します。
注 - この API は、JDK システムセキュリティ用に内部的に使用することはできません。この API は JDK 1.1 から導入され、後方互換性のために残されています。将来のリリースで実質的な変更、拡張が行われたり、また完全に置き換えられる可能性があります。このドキュメントでは、現在のインタフェースについて説明します。
ACL は、複数の ACL 項目を持つデータ構造体だと考えることができます。それぞれの ACL 項目は、特定のプリンシパルに関連するアクセス権のセットを含んでいます。(プリンシパルは個別のユーザやグループなどのエンティティを表す)。さらに、各 ACL 項目は、正または負に指定されています。正の場合は、関連するプリンシパルにアクセス権が与えられます。負の場合、アクセス権は拒否されます。
アクセスコントロールリストは、プリンシパルの妥当性の検査に使用する認証方式に依存しません。また、ネットワーク全体にデータを転送するために使用される暗号化方式にも依存しません。ACL は認証フェーズのあとで調査されます。プリンシパルがシステムで権限のあるユーザであると確認されると、プリンシパルはリソースにアクセスすることができます。リソースごとに、リソースを保護する ACL のプリンシパルに与えられたアクセス権に応じて、プリンシパルはアクセスを許可されたりされなかったりします。ACL それ自身は、保護するプリンシパルに依存しません。ACL を調査することにより、特定のプリンシパルが持つアクセス権のリストを見つけたり、プリンシパルに特定のアクセス権が与えられているかどうかを調べたりすることができます。
ACL は、java.security.acl.Acl インタフェースを実装するオブジェクトです。 各 ACL は、AclEntry オブジェクトのリストです。各 AclEntry は、Principal または Group オブジェクトを Permission オブジェクトのリストに関連付けます。(注 - Group は Principal のサブクラスです。) 各 AclEntry は、正のエントリまたは負のエントリとして作成することもできます。正のエントリはエントリのアクセス権のリストをプリンシパルやグループに与え、負のエントリはプリンシパルやグループへのアクセス権のリストを拒否します。
プリンシパルが付与されるネットアクセス権を計算するときは、次の規則を使用します。
プリンシパル P がグループ G1 と G2 に所属するとします。以下に、G1、G2、P に与えられるアクセス権の例を使って 5 列の表を示します。P に与えられるアクセス権は最後の列に表示されます。
グループ G1 アクセス権 | グループ G2 アクセス権 | 共用体 (G1、G2) アクセス権 | 個々のアクセス権 | 付与されるアクセス権 | ||
---|---|---|---|---|---|---|
正 | A | B | A+B | C | A+B+C | |
負 | null セット | null セット | null セット | null セット | ||
正 | A | B | B | C | B+C | |
負 | -C | -A | -C | null セット | ||
正 | A | B | A+B | C | B+C | |
負 | null セット | null セット | null セット | -A | ||
正 | A | C | A | B | B | |
負 | -C | -B | -B | -A |
/* Note: This sample program is meant just as an example * of the types of things that can be done with an * implementation of the java.security.acl interfaces. * This example uses the implementation supplied by the * sun.security.acl package. Please note that sun.* classes * are unsupported and subject to change. */ import java.security.Principal; import java.security.acl.*; import sun.security.acl.*; import java.util.Enumeration; public class AclEx { public static void main(String argv[]) throws Exception { Principal p1 = new PrincipalImpl("user1"); Principal p2 = new PrincipalImpl("user2"); Principal owner = new PrincipalImpl("owner"); Permission read = new PermissionImpl("READ"); Permission write = new PermissionImpl("WRITE"); System.out.println("Creating a new group with two members: user1 and user2"); Group g = new GroupImpl("group1"); g.addMember(p1); g.addMember(p2); // // create a new acl with the name "exampleAcl" // System.out.println("Creating a new Acl named 'exampleAcl'"); Acl acl = new AclImpl(owner, "exampleAcl"); // // Allow group all permissions // System.out.println("Creating a new Acl Entry in exampleAcl for the group, "); System.out.println(" with read & write permissions"); AclEntry entry1 = new AclEntryImpl(g); entry1.addPermission(read); entry1.addPermission(write); acl.addEntry(owner, entry1); // // Take away WRITE permissions for // user1. All others in groups still have // WRITE privileges. // System.out.println("Creating a new Acl Entry in exampleAcl for user1"); System.out.println(" without write permission"); AclEntry entry2 = new AclEntryImpl(p1); entry2.addPermission(write); entry2.setNegativePermissions(); acl.addEntry(owner, entry2); // // This enumeration is an enumeration of // Permission interfaces. It should return // only "READ" permission. Enumeration e1 = acl.getPermissions(p1); System.out.println("Permissions for user1 are:"); while (e1.hasMoreElements()) { System.out.println(" " + e1.nextElement()); }; // // This enumeration should have "READ" and"WRITE" // permissions. Enumeration e2 = acl.getPermissions(p2); System.out.println("Permissions for user2 are:"); while (e2.hasMoreElements()) { System.out.println(" " + e2.nextElement()); }; // This should return false. boolean b1 = acl.checkPermission(p1, write); System.out.println("user1 has write permission: " + b1); // This should all return true; boolean b2 = acl.checkPermission(p1, read); boolean b3 = acl.checkPermission(p2, read); boolean b4 = acl.checkPermission(p2, write); System.out.println("user1 has read permission: " + b2); System.out.println("user2 has read permission: " + b3); System.out.println("user2 has write permission: " + b4); } }