Module  java.base

Interface AclFileAttributeView

  • All Superinterfaces:
    AttributeViewFileAttributeViewFileOwnerAttributeView


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

    ACL用于指定文件系统对象的访问权限。 ACL是access-control-entries的有序列表,每个都指定一个UserPrincipal以及该用户主体的访问级别。 该文件属性视图定义getAcl ,和setAcl方法读取和写入基于在指定的ACL模型的ACL RFC 3530: Network File System (NFS) version 4 Protocol 此文件属性视图适用于支持NFSv4 ACL模型或在NFSv4 ACL模型与文件系统使用的ACL模型之间的定义良好的映射的文件系统实现。 这种映射的细节依赖于实现,因此是未指定的。

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

    当一个文件系统提供访问不一致的一组file-systems ,只有一些文件系统可能支持ACL。 supportsFileAttributeView方法可用于测试文件系统是否支持ACL。

    互通性

    RFC 3530允许在支持POSIX定义的访问权限的平台上使用特殊用户身份。 特殊用户身份是“ OWNER@ ”,“ GROUP@ ”和“ EVERYONE@ ”。 当支持AclFileAttributeViewPosixFileAttributeView ,这些特殊用户身份可能被包含在被读取或写入的ACL entries中。 文件系统的UserPrincipalLookupService可以通过调用lookupPrincipalByName方法来获得UserPrincipal来表示这些特殊身份。

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

      // lookup "joe"
         UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService()
             .lookupPrincipalByName("joe");
    
         // get view
         AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class);
    
         // create ACE to give "joe" read access
         AclEntry entry = AclEntry.newBuilder()
             .setType(AclEntryType.ALLOW)
             .setPrincipal(joe)
             .setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES)
             .build();
    
         // read ACL, insert ACE, re-write ACL
         List<AclEntry> acl = view.getAcl();
         acl.add(0, entry);   // insert before any DENY entries
         view.setAcl(acl); 

    动态访问

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

    Supported attributes
    Name Type
    "acl" List<AclEntry>
    "owner" UserPrincipal

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

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

    创建文件时设置ACL

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

    在实现支持与NFSv4定义的ACL模型不同的ACL模型的情况下,创建文件时设置初始ACL必须将ACL转换为文件系统支持的模型。 创建文件的方法应该拒绝(通过抛出IOException )任何尝试创建由于翻译而不太安全的文件。

    从以下版本开始:
    1.7
    • 方法详细信息

      • getAcl

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

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

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

        结果
        表示ACL的entries的有序列表
        异常
        IOException - 如果发生I / O错误
        SecurityException - 在默认提供程序的情况下,安装了一个安全管理器,它将拒绝RuntimePermission ("accessUserInformation")或其checkRead方法拒绝对该文件的读取访问。
      • setAcl

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

        文件系统支持访问控制列表的位置,并且使用与NFSv4定义的ACL模型不同的ACL模型,则该方法必须将ACL转换为文件系统支持的模型。 这种方法应该拒绝(通过抛出IOException )任何尝试编写一个ACL,这样做会使文件比ACL更新时更安全。 在实现不支持AclEntryType.AUDITAclEntryType.ALARM条目的映射的情况下 ,此方法在写入ACL时将忽略这些条目。

        如果ACL条目包含一个user-principal不与相同的提供这个属性视图,则相关ProviderMismatchException被抛出。 额外的验证(如果有的话)依赖于实现。

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

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