ACL用于指定对文件系统对象的访问权限。ACL是一个有序列表,每个条目指定一个访问控制条目
,每个条目指定一个UserPrincipal
和该用户主体的访问级别。此文件属性视图定义了基于RFC 3530: 网络文件系统(NFS)版本4协议中指定的ACL模型读取和写入ACL的getAcl
和setAcl
方法。此文件属性视图适用于支持NFSv4 ACL模型或在NFSv4 ACL模型与文件系统使用的ACL模型之间有明确定义映射的文件系统实现。此类映射的细节取决于实现,并因此未指定。
此类还扩展了FileOwnerAttributeView
,以定义获取和设置文件所有者的方法。
当文件系统提供对一组不同的文件系统
的访问时,只有一些文件系统可能支持ACL。可以使用supportsFileAttributeView
方法来测试文件系统是否支持ACL。
互操作性
RFC 3530允许在支持POSIX定义的访问权限的平台上使用特殊用户标识。特殊用户标识为"OWNER@
", "GROUP@
", 和 "EVERYONE@
"。当同时支持AclFileAttributeView
和PosixFileAttributeView
时,这些特殊用户标识可以包含在读取或写入的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或所有者属性,就像调用getAcl
或getOwner
方法一样。
可以使用setAttribute
方法更新ACL或所有者属性,就像调用setAcl
或setOwner
方法一样。
创建文件时设置ACL
支持此属性视图的实现还可以支持在创建文件或目录时设置初始ACL。初始ACL可以作为一个带有FileAttribute
的参数提供给诸如createFile
或createDirectory
等方法,其中name
为"acl:acl"
,value
为AclEntry
对象的列表。
当实现支持与NFSv4定义的ACL模型不同的ACL模型时,在创建文件时设置初始ACL必须将ACL转换为文件系统支持的模型。创建文件的方法应拒绝(通过抛出IOException
)任何尝试创建文件的操作,如果由于转换导致文件不安全。如果一个ACL条目包含一个与此属性视图不同提供程序关联的用户主体
,则会抛出ProviderMismatchException
。其他验证(如果有)是实现相关的。
- 自版本:
- 1.7
- 外部规范
-
Method Summary
Methods declared in interface java.nio.file.attribute.FileOwnerAttributeView
getOwner, setOwner
-
Method Details
-
name
String name()返回属性视图的名称。此类型的属性视图的名称为"acl"
。- 指定者:
-
name
在接口AttributeView
- 指定者:
-
name
在接口FileOwnerAttributeView
- 返回:
- 属性视图的名称
-
getAcl
读取访问控制列表。当文件系统使用与NFSv4定义的ACL模型不同的ACL模型时,此方法返回将ACL转换为NFSv4 ACL模型的ACL。
返回的列表是可修改的,以便更改现有ACL。使用
setAcl
方法来更新文件的ACL属性。- 返回:
-
代表ACL的
条目
的有序列表 - 抛出:
-
IOException
- 如果发生I/O错误 -
SecurityException
- 在默认提供程序的情况下,安装了安全管理器,并且拒绝RuntimePermission
("accessUserInformation")
或其checkRead
方法拒绝对文件的读取访问。
-
setAcl
更新(替换)访问控制列表。如果文件系统支持访问控制列表,并且使用与NFSv4定义的ACL模型不同的ACL模型,则此方法必须将ACL转换为文件系统支持的模型。当写入ACL时,此方法应拒绝(通过抛出
IOException
)任何尝试写入ACL的操作,如果ACL更新后文件看起来比更新前更安全。如果一个ACL条目包含一个与此属性视图不同提供程序关联的用户主体
,则会抛出ProviderMismatchException
。其他验证(如果有)是实现相关的。如果文件系统支持其他安全相关的文件属性(例如文件
访问权限
),更新访问控制列表也可能导致更新这些安全相关的属性。- 参数:
-
acl
- 新的访问控制列表 - 抛出:
-
IOException
- 如果发生I/O错误或ACL无效 -
SecurityException
- 在默认提供程序的情况下,安装了安全管理器,它拒绝RuntimePermission
("accessUserInformation")
或其checkWrite
方法拒绝对文件的写访问。
-