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

Permission denied for accessing file through restful api

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

@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 实例为 运行ning 的服务器上所有文件所在目录的路径。

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

然而,当我尝试检索文件时,我得到了 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 身份登录服务器时,我可以毫无问题地读取那个确切的文件。

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

编辑: 我发现一个 tomcat 进程与我的 war 所在的文件夹相关联。确实是 risdev 的 运行 谁应该拥有这些文件的权限。

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

访问文件时权限被拒绝

检查以下条件:

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

作为参考,您可以使用以下命令检查 运行 个进程的所有者:

ps -ef 

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

ps -ef |grep java

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

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