rest - 通过 restful api 访问文件的权限被拒绝

标签 rest tomcat permissions filesystems streaming

在我的网络应用程序中,我实现了一种在我的 Controller 中下载文件的方法:

@RequestMapping(
        value = "/ristore/foundation/xml/{filename}",
        method = RequestMethod.GET,
        produces = "application/xml")
public ResponseEntity<byte[]> downloadXMLFile(@PathVariable String filename) throws IOException {
    FileSystemResource xmlFile = new FileSystemResource("/rsrch1/rists/moonshot/data/prod/foundation/xml/" + filename + ".xml");
    byte [] content = new byte[(int)xmlFile.contentLength()];
    IOUtils.read(xmlFile.getInputStream(), content);

    return ResponseEntity.ok()
        .contentType(MediaType.parseMediaType("application/octet-stream"))
        .contentLength(xmlFile.contentLength())
        .body(content);
}

我在方法中硬编码了文件的路径。它是运行 Tomcat 实例的服务器上所有文件所在目录的路径。

我在tomcat服务器上部署了war。 Web 应用程序归用户 risdev 所有。 enter image description here

但是,当我尝试检索文件时,我得到了 500。在 catalina.out 中,它显示如下错误:

[/ristore/foundation/xml/TRF174146_09092016230414] due to exception [/rsrch1/rists/moonshot/data/prod/foundation/xml/TRF174146_09092016230414.xml (Permission denied)]

服务器的管理员授予 risdev 访问该文件夹的权限。当我以 risdev 身份登录服务器时,我可以毫无问题地读取那个确切的文件。 enter image description here

那为什么我没有权限通过api读取呢?实际获取文件的用户是谁?

编辑: 我找到了一个与部署我的war的文件夹关联的tomcat进程。它确实是由理应有权访问这些文件的 risdev 运行的。

编辑#2 刚刚与在此服务器上安装 tomcat 的管理员确认。他确实使用risdev安装tomcat实例,安装后运行startup.sh。所以 tomcat 肯定由 risdev 拥有和运行。在同一台服务器上,risdev 肯定具有访问该文件夹中文件的读取权限,如命令行(ls 和 less)所确认的那样。只是通过tomcat访问文件时权限被拒绝。

enter image description here

最佳答案

检查以下条件:

  1. Tomcat 必须以 risdev 用户启动才能访问此文件夹。
  2. 文件夹“/rsrch1/rists/moonshot/data/prod/foundation/xml/”及其中的所有文件必须具有 risdev 所有者(或其他人或相应组的读/写权限)。

作为引用,您可以使用以下命令检查正在运行的进程的所有者:

ps -ef 

并使用 grep 缩小结果范围。示例:

ps -ef |grep java

如何更改文件夹及其中所有文件的所有者:

chown -R rizdev /rsrch1/rists/moonshot/data/prod/foundation/xml/

关于rest - 通过 restful api 访问文件的权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540000/

相关文章:

mysql - 即使在添加 X-Total-Count 后,分页和排序也无法按预期在 react-admin 中工作

Java 7 并行执行并未使用倒计时锁存器提高 REST API 的性能

Tomcat、WELD 3、CDI 2、WeldTerminalListener

java - 使用 Cloudflare 进行 Tomcat/TomEE SSL 配置

java - 在 webapp 中删除文件时 Tomcat 8.5.42 权限被拒绝

java - 如何在 Java 中使用 REST

javascript - spring boot 运行但独立的 tomcat 不工作

python - pip 权限错误 : [Errno 13] inside virtual environment

android - 清除下载权限拒绝?

python - 访问 Flask-Restful 资源中的 API 记录器