Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Абстракции Управления доступом

Последний Измененный: 30 апреля 2001


java.security.acl


Введение

Список управления доступом (ACL) является структурой данных, которая охраняет доступ к ресурсам. java.security.acl пакет обеспечивает интерфейс для такой структуры данных, и sun.security.acl пакет обеспечивает реализацию по умолчанию интерфейсов, определенных в java.security.acl пакете.

Отметьте: Этот API не используется внутренне для безопасности системы JDK. Это было представлено в JDK 1.1, и остается для назад совместимости. Это может подвергнуться существенной версии и расширению или даже замене в будущих выпусках. Этот документ описывает текущие интерфейсы.

ACL может считаться структурой данных с многократными записями ACL. Каждая запись ACL, AclEntry типа интерфейса, содержит ряд полномочий, связанных с определенным принципалом. (Принципал представляет объект, такой как отдельный пользователь или группа). Дополнительно, каждая запись ACL определяется как являющийся или положительным или отрицательным. Если положительный, полномочия нужно предоставить связанному принципалу. Если отрицание, полномочия должны отрицаться.

Список управления доступом независим от схемы аутентификации, используемой, чтобы проверить законность принципала. Это также независимо от схемы шифрования, используемой, чтобы передать данные по сети. С ACL консультируются после фазы аутентификации. После того, как принципал проверяется, чтобы быть аутентифицируемым пользователем в системе, принципал мог бы получить доступ к ресурсам. Для каждого такого ресурса принципал мог бы или не мог бы быть предоставленным доступом в зависимости от полномочий, которые предоставляют принципалу в ACL, который охраняет ресурс. Сам ACL независим от ресурса, который он охраняет. С ACL можно консультироваться, чтобы найти список полномочий, которые определенный принципал имеет или узнать, предоставляют ли принципалу определенное разрешение.

Структура ACL

ACL является объектом, который реализует java.security.acl. Интерфейс Acl. Каждый Acl является списком объектов AclEntry. Каждый AclEntry связывает Принципал или Групповой объект к списку Объектов полномочий. (Отметьте: Группа является подклассом Принципала.) Каждый AclEntry может также определяться как положительная запись или отрицательная запись. Положительная запись предоставляет список полномочий в записи в принципал или группу, и отрицательная запись отрицает список полномочий к принципалу или группе.

Вычисление предоставленных полномочий

Вычисляя сетевые полномочия принципал предоставляют, следующие правила используются.

  1. У каждого принципала или группы могут быть самое большее одна положительная запись ACL и одна отрицательная запись; то есть, многократные положительные или отрицательные записи ACL не позволяются ни для какого принципала или группы.
  2. Если нет никакой записи для определенного принципала или группы, то у принципала или группы есть нулевой набор полномочий.
  3. Положительный набор полномочий сетевой группы для принципала является объединением всех положительных полномочий каждой группы, которой принадлежит принципал.
  4. Отрицательный набор полномочий сетевой группы для принципала является объединением всех отрицательных полномочий каждой группы, которой принадлежит принципал.
  5. Если есть положительная запись, которая предоставляет принципалу или группе определенное разрешение и отрицательную запись, которая отрицает принципал, или сгруппируйте то же самое разрешение, то то разрешение удаляется и из положительного набора полномочий и из отрицательного набора полномочий.
  6. Отдельные полномочия (полномочия, предоставленные или отрицаемые к определенному принципалу) всегда, переопределяют Групповые полномочия. Определенно, отдельные отрицательные полномочия (определенный отказ полномочий) переопределяют положительные полномочия группы. И отдельные положительные полномочия переопределяют отрицательные полномочия группы.
  7. Предположите, что положительный набор полномочий всех групп, которым принадлежит принципал, является g1 и отрицательным набором полномочий всех групп, которым принадлежит принципал, g2. Также предположите, что отдельный положительный набор полномочий для принципала является p1, и отдельный отрицательный набор полномочий для принципала является p2. Затем получающиеся полномочия, которые предоставляют принципал, (p1 + (g1 - p2)) - (p2 + (g2 - p1)).

Вычисления разрешения в качестве примера

Предположите, что принципал P принадлежит группам G1 и G2. Таблица ниже показывает 5 столбцов, используя некоторые примеры полномочий, данных G1, G2 и P. Получающиеся полномочия, предоставленные P, показывают в последнем столбце.

Группа Полномочия G1 Группа Полномочия G2 Объединение (G1, G2) перманент Отдельные Полномочия Получающиеся Полномочия
Положительный A B A+B C A+B+C
Отрицательный пустое множество пустое множество пустое множество пустое множество A+B+C

Положительный A B B C B+C
Отрицательный -C -A -C пустое множество B+C

Положительный A B A+B C B+C
Отрицательный пустое множество пустое множество пустое множество -A B+C

Положительный A C A B B
Отрицательный -C -B -B -A B


Использование в качестве примера

/* 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);
  }
}

Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами