模块 java.base

接口 AclFileAttributeView

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

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

ACL 用于指定对文件系统对象的访问权限。 ACL 是 access-control-entries 的有序列表,每个列表指定一个 UserPrincipal 和该用户主体的访问级别。此文件属性视图定义了 getAcl setAcl 方法,以根据 RFC 3530:网络文件系统 (NFS) 版本 4 协议 中指定的 ACL 模型读取和写入 ACL。此文件属性视图适用于支持 NFSv4 ACL 模型或在 NFSv4 ACL 模型和文件系统使用的 ACL 模型之间具有well-defined映射的文件系统实现。这种map的细节依赖于实现,因此未指定。

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

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

互操作性

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

使用示例:假设我们希望向现有 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);
 

动态访问

在需要动态访问文件属性的地方,该属性视图支持的属性如下:

支持的属性
Name Type
“ACL” List <AclEntry >
“所有者” UserPrincipal

getAttribute 方法可用于读取 ACL 或所有者属性,就像调用 getAcl getOwner 方法一样。

setAttribute 方法可用于更新 ACL 或所有者属性,就像调用 setAcl setOwner 方法一样。

创建文件时设置ACL

支持此属性视图的实现也可能支持在创建文件或目录时设置初始 ACL。可以将初始 ACL 提供给方法,例如 createFile createDirectory 作为 FileAttribute name "acl:acl"value AclEntry 对象的列表。

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

自从:
1.7
  • 方法详情

    • name

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

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

      当文件系统使用不同于 NFSv4 定义的 ACL 模型的 ACL 模型时,此方法返回一个 ACL,该 ACL 是 ACL 到 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 似乎使文件比更新 ACL 时更安全。如果实现不支持 AclEntryType.AUDIT AclEntryType.ALARM 条目的映射,则此方法在编写 ACL 时将忽略这些条目。

      如果 ACL 条目包含一个 user-principal ,但它与此属性视图没有关联到同一提供者,则抛出 ProviderMismatchException 。额外的验证(如果有的话)是依赖于实现的。

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

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