检查 samba 安装权限时 Java 是否完全兼容?

Is Java fully compatible when checking permissions on a samba mount?

我正在使用

Files.isWritable(file)

在我的 Java 应用程序中检查我是否有权在修改文件之前修改它。

这通常可以正常工作,但我有一位客户抱怨说,尽管他已经完全许可他的文件,但仍然无法正常工作。客户设置包括一个远程 linux 驱动器,通过 Samba 安装到他的 Windows 机器上,而我的软件是 运行 在 Windows 机器上。

事实证明,他已经为特定用户授予了对文件夹和文件的完全权限,而不是用户组或 linux 上的任何其他人。

如果他将 linux 的权限从 700 更改为 777 那么它就可以工作,但我不确定他是否应该这样做?

检查 samba 挂载权限时 Java 是否有问题

视情况而定。

UNIX 和 Windows 上的访问控制机制在传统上是不同的。以前,与 samba3 一样,您在这些权限之间有一个相当粗略的映射,这在较简单的情况下有效,但在较困难的情况下会出现问题。您可以找到许多处理这些特殊情况的教程、论坛帖子和邮件列表。

现在,情况变得更好了,因为有 NFSv4 风格的访问控制列表。优点有几个:

  • 它就像一个接口:您对不同的系统具有相同的权限 "ideas",它们实现了自己的文件系统相关细节,这意味着您(或 Java)只需使用高级的东西。
  • 它比旧的基本 UNIX 权限灵活得多,包含 创建新文件创建新子目录 等内容,详细继承对于文件 and/or 目录,或拒绝和允许组合规则。
  • 尽管名称不同,它不仅适用于 NFS 版本 4,还适用于当前的 Windows 权限、ZFS 上的 Solaris 10/illumos CIFS 实现和 Linux 系统上的 samba4(我相信) .

您通常使用 ACLFileAttributeView,如简短示例中所述:

 // 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);

在您的情况下,查询第二步中的视图以获得您想要检查的权限就足够了。详细的概览,我喜欢用这个documentation from Oracle - while the examples are from chmod, the permissions themselves are the same in Java (but there also exists the shorter JavaDoc for them, AclEntryPermission Enums).