首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在作为root用户运行的Java线程中,如何应用特定于登录用户的Unix权限?

在作为root用户运行的Java线程中,如何应用特定于登录用户的Unix权限?
EN

Stack Overflow用户
提问于 2008-11-05 09:32:57
回答 7查看 3.8K关注 0票数 3

我们有一个在Unix上以的形式运行的程序,因此可以读取例如/home/user1/home/user2文件夹的内容。但是,如果Unix用户"user1“登录到我们的应用程序中,他就不能访问”/home/ user 2“数据。我们希望直接使用Unix权限,而不是在我们的应用程序中重新创建所有权限!那么我们能不能..。

  1. 试着根据登录的用户更改程序的UID吗?听起来很困难,而且每个文件访问都在不同的线程中,所以我们程序的每个线程上的UID都是不同的。
  2. 使用JNI读取"/home/user2"...And的权限,然后确定user1对"/home/user2“是否有足够的权限?(如何?)
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-11-05 12:14:32

使用SecurityManager!

  1. 将当前unix用户id放入ThreadLocal
  2. 创建自己的SecurityManager,检查unix用户对checkRead()和checkWrite()的权限
  3. System.setSecurityManager(新MySecurityManager())
  4. 尽情享受

更新

当然,没有标准库可以读取unix文件权限。不是WORA。

但我曾短暂地尝试过寻找一个现成的使用库,并发现了这个库:http://jan.newmarch.name/java/posix/ --它使用JNI,但是您不需要编写自己的JNI代码,这是一个很大的解脱。)我相信肯定还有其他人。

类Stat为您提供所有必需的访问信息:http://jan.newmarch.name/java/posix/posix.Stat.html

更新2

正如人们所提到的,这种方法无法检查“非标准”unix安全特性,例如ACL或Posix功能(可能;不确定它们是否适用于文件)。但是,如果设置了与主机操作系统安全完全同步的目标,那么我们更需要使用SecurityManager,因为它是一个JVM范围的保护机制!是的,我们可以启动一个子SUID进程来验证权限(并保持它运行,在用户登录时通过管道运行),,但是我们需要从SecurityManager中这样做!

票数 2
EN

Stack Overflow用户

发布于 2008-11-05 10:09:11

最简单和最可移植的方法是生成一个子进程,让它执行一个用C编写的包装器,它更改了UID,放弃了所有特权(要小心,编写一个包装器就很棘手--这就像编写一个setuid包装程序一样困难),并执行通过RMI与之交谈的另一个java实例。该java实例将代表用户执行所有文件系统操作。

对于单线程Linux程序,您可以使用setfsuid()/setfsgid(),但对于可移植或多线程程序来说,这不是一个选项。

票数 2
EN

Stack Overflow用户

发布于 2008-11-05 09:54:51

如果您只希望user1允许应用程序读取文件,我强烈建议该应用程序以user1的形式运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/264681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档