アクセスコントロールリスト(ACL)は、リソースへのアクセスを保護するデータ構造体です。 java.security.acl パッケージは、このようなデータ構造体へのインタフェースを提供し、sun.security.acl パッケージは java.security.acl パッケージで指定したインタフェースのデフォルトの実装を提供します。
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 に与えられるパーミッションは最後のカラムに表示されます。
| Group G1 Permissions | Group G2 Permissions | Union (G1, G2) perms | Individual Permissions | Resulting Permissions | ||
|---|---|---|---|---|---|---|
| Positive | A | B | A+B | C | A+B+C | |
| Negative | null set | null set | null set | null set | ||
| Positive | A | B | B | C | B+C | |
| Negative | -C | -A | -C | null set | ||
| Positive | A | B | A+B | C | B+C | |
| Negative | null set | null set | null set | -A | ||
| Positive | A | C | A | B | B | |
| Negative | -C | -B | -B | -A |
import java.security.acl.*;
import sun.security.acl.*;
public class Example {
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");
Group g = new GroupImpl("group1");
g.addMember(p1);
g.addMember(p2);
//
// create a new acl with the name "exampleAcl"
//
Acl acl = new AclImpl(owner, "exampleAcl");
//
// Allow group all 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.
//
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);
//
// This enumeration should have "READ" and"WRITE"
// permissions.
Enumeration e2 = acl.getPermissions(p2);
// This should return false.
boolean b1 = acl.checkPermission(p1, write);
// This should all return true;
boolean b2 = acl.checkPermission(p1, read);
boolean b3 = acl.checkPermission(p2, read);
boolean b4 = acl.checkPermission(p2, write);
}