java - 在子文件夹( 缺少继承) 上,使用java文件权限设置ACL失败

  显示原文与译文双语对照的内容

以下代码为组"读取"测试的文件夹"mysharefolder1"设置权限:


String gName="G-Test";


AclEntryPermission[] aeps=new AclEntryPermission[]{


 AclEntryPermission.READ_DATA,


 AclEntryPermission.READ_ATTRIBUTES,


 AclEntryPermission.READ_NAMED_ATTRS,


 AclEntryPermission.READ_ACL,


 AclEntryPermission.SYNCHRONIZE


 }; 


Path p = FileSystems.getDefault().getPath(new File("myShareFolder1").getPath());


AclFileAttributeView view = Files.getFileAttributeView(p, AclFileAttributeView.class);


Set<AclEntryPermission> set = EnumSet.noneOf(AclEntryPermission.class);


for (AclEntryPermission acp: aeps) set.add(acp);


AclEntry.Builder b= AclEntry.newBuilder();


b.setType(AclEntryType.ALLOW);


b.setPermissions(set);


b.setPrincipal(FileSystems.getDefault().getUserPrincipalLookupService().lookupPrincipalByName(gName));


b.setFlags(new AclEntryFlag[]{AclEntryFlag.FILE_INHERIT,AclEntryFlag.DIRECTORY_INHERIT}); 


List<AclEntry> acl = view.getAcl();


acl.add(b.build());


view.setAcl(acl);



这对于我们所期望的。 但是在 Folder2 ( 子文件夹:myShareFolder1Folder2) 中没有继承 ACL ) 。 在查找 Windows GUI时,模板中缺少继承的ACL 。

在更改用于它的他组/权限的Windows 中的ACL时,我可以看到前面缺少的on的权限。 或者在创建新的子文件夹时ACL是正确继承的。

上面的代码有问题? 要对所有子文件夹和文件继承的folder1设置读取权限。

代码运行在 Windows 8.1电脑上,共享是一个 Windows 2008 R2文件- 集群

时间: 原作者:

你的代码工作得很好。我有一个几乎同样的结构来设置我的环境中的权限。 问题在于,在修改权限时,Folder2已经存在。 一些 Windows API调用将更改传播到目录树中,有些则不是( 请看这个问题的答案。) 。 JRE必须使用其中一个不使用。 我想你必须走树来自己传播改变。 但是,如果在权限设置之后创建 Folder2,那么它将拥有从顶级( 至少它在我的上) 继承的权限。

编辑:我想了一些更多的问题,并且我想我可以能还需要在未来的树上走步。 因为我们在这里谈到 Java 7,我寻找一种比我使用的树更简单的方法。 事实证明 Files.walkFileTree() 方法仅仅是 ! 我想到了这个,尽管我愿意分享它:


private void grantAccess(final UserPrincipal user, Path folder) {


 try {


 Files.walkFileTree(folder, new SimpleFileVisitor<Path>() { 


 @Override


 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {


 grant(dir);


 return FileVisitResult.CONTINUE;


 }



 @Override


 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {


 grant(file);


 return FileVisitResult.CONTINUE;


 }



 private void grant(Path p) throws IOException {


 AclFileAttributeView view = Files.getFileAttributeView(p, AclFileAttributeView.class);


 AclEntry accessEntry = createAccessACLEntry(user);


 List<AclEntry> acl = view.getAcl();


 acl.add(0, accessEntry);//insert at head in case there are any DENY entries


 view.setAcl(acl);


 }



 private AclEntry createAccessACLEntry(UserPrincipal user) {


 AclEntry entry = AclEntry


. newBuilder()


. setType(AclEntryType.ALLOW)


. setPrincipal(user)


. setPermissions(AclEntryPermission.DELETE_CHILD,


 AclEntryPermission.WRITE_NAMED_ATTRS,


 AclEntryPermission.EXECUTE,


 AclEntryPermission.WRITE_DATA,


 AclEntryPermission.WRITE_ATTRIBUTES,


 AclEntryPermission.READ_ATTRIBUTES,


 AclEntryPermission.APPEND_DATA,


 AclEntryPermission.READ_DATA,


 AclEntryPermission.READ_NAMED_ATTRS,


 AclEntryPermission.READ_ACL,


 AclEntryPermission.SYNCHRONIZE,


 AclEntryPermission.DELETE)


. setFlags(AclEntryFlag.FILE_INHERIT,


 AclEntryFlag.DIRECTORY_INHERIT) 


. build();


 return entry;


 }


 });


 } catch (IOException e) {


 throw new IllegalStateException("Unable to grant access for" + folder.toString() +" to" + user.getName(), e);


 }


}



为了更改文件和文件夹的权限,你必须重写 visitFile() 和 preVisitDirectory(),尽管你可以将 postVisitDirectory() 替换为 preVisitDirectory() 。

原作者:
...