Module java.base

Interface AclFileAttributeView

所有超级接口:
AttributeView, FileAttributeView, FileOwnerAttributeView

public interface AclFileAttributeView extends FileOwnerAttributeView
支持读取或更新文件的访问控制列表(ACL)或文件所有者属性的文件属性视图。

ACL用于指定对文件系统对象的访问权限。ACL是一个有序列表,每个条目指定一个访问控制条目,每个条目指定一个UserPrincipal和该用户主体的访问级别。此文件属性视图定义了基于RFC 3530: 网络文件系统(NFS)版本4协议中指定的ACL模型读取和写入ACL的getAclsetAcl方法。此文件属性视图适用于支持NFSv4 ACL模型或在NFSv4 ACL模型与文件系统使用的ACL模型之间有明确定义映射的文件系统实现。此类映射的细节取决于实现,并因此未指定。

此类还扩展了FileOwnerAttributeView,以定义获取和设置文件所有者的方法。

当文件系统提供对一组不同的文件系统的访问时,只有一些文件系统可能支持ACL。可以使用supportsFileAttributeView方法来测试文件系统是否支持ACL。

互操作性

RFC 3530允许在支持POSIX定义的访问权限的平台上使用特殊用户标识。特殊用户标识为"OWNER@", "GROUP@", 和 "EVERYONE@"。当同时支持AclFileAttributeViewPosixFileAttributeView时,这些特殊用户标识可以包含在读取或写入的ACL条目中。文件系统的UserPrincipalLookupService可以通过调用lookupPrincipalByName方法来获取表示这些特殊标识的UserPrincipal

使用示例: 假设我们希望向现有ACL添加一个条目以授予"joe"访问权限:

    // 查找"joe"
    UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService()
        .lookupPrincipalByName("joe");

    // 获取视图
    AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class);

    // 创建ACE以授予"joe"读取权限
    AclEntry entry = AclEntry.newBuilder()
        .setType(AclEntryType.ALLOW)
        .setPrincipal(joe)
        .setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES)
        .build();

    // 读取ACL,插入ACE,重新写入ACL
    List<AclEntry> acl = view.getAcl();
    acl.add(0, entry);   // 在任何DENY条目之前插入
    view.setAcl(acl);

动态访问

当需要动态访问文件属性时,此属性视图支持的属性如下:

支持的属性
名称 类型
"acl" List<AclEntry>
"owner" UserPrincipal

可以使用getAttribute方法读取ACL或所有者属性,就像调用getAclgetOwner方法一样。

可以使用setAttribute方法更新ACL或所有者属性,就像调用setAclsetOwner方法一样。

创建文件时设置ACL

支持此属性视图的实现还可以支持在创建文件或目录时设置初始ACL。初始ACL可以作为一个带有FileAttribute的参数提供给诸如createFilecreateDirectory等方法,其中name"acl:acl"valueAclEntry对象的列表。

当实现支持与NFSv4定义的ACL模型不同的ACL模型时,在创建文件时设置初始ACL必须将ACL转换为文件系统支持的模型。创建文件的方法应拒绝(通过抛出IOException)任何尝试创建文件的操作,如果由于转换导致文件不安全。如果一个ACL条目包含一个与此属性视图不同提供程序关联的用户主体,则会抛出ProviderMismatchException。其他验证(如果有)是实现相关的。

自版本:
1.7
外部规范
  • Method Details

    • name

      String name()
      返回属性视图的名称。此类型的属性视图的名称为"acl"
      指定者:
      name 在接口 AttributeView
      指定者:
      name 在接口 FileOwnerAttributeView
      返回:
      属性视图的名称
    • getAcl

      List<AclEntry> getAcl() throws IOException
      读取访问控制列表。

      当文件系统使用与NFSv4定义的ACL模型不同的ACL模型时,此方法返回将ACL转换为NFSv4 ACL模型的ACL。

      返回的列表是可修改的,以便更改现有ACL。使用setAcl方法来更新文件的ACL属性。

      返回:
      代表ACL的条目的有序列表
      抛出:
      IOException - 如果发生I/O错误
      SecurityException - 在默认提供程序的情况下,安装了安全管理器,并且拒绝RuntimePermission("accessUserInformation")或其checkRead方法拒绝对文件的读取访问。
    • setAcl

      void setAcl(List<AclEntry> acl) throws IOException
      更新(替换)访问控制列表。

      如果文件系统支持访问控制列表,并且使用与NFSv4定义的ACL模型不同的ACL模型,则此方法必须将ACL转换为文件系统支持的模型。当写入ACL时,此方法应拒绝(通过抛出IOException)任何尝试写入ACL的操作,如果ACL更新后文件看起来比更新前更安全。如果一个ACL条目包含一个与此属性视图不同提供程序关联的用户主体,则会抛出ProviderMismatchException。其他验证(如果有)是实现相关的。

      如果文件系统支持其他安全相关的文件属性(例如文件访问权限),更新访问控制列表也可能导致更新这些安全相关的属性。

      参数:
      acl - 新的访问控制列表
      抛出:
      IOException - 如果发生I/O错误或ACL无效
      SecurityException - 在默认提供程序的情况下,安装了安全管理器,它拒绝RuntimePermission("accessUserInformation")或其checkWrite方法拒绝对文件的写访问。