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

时间:2016-09-16 21:00:24

标签: rest tomcat permissions filesystems streaming

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

@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服务器上部署了战争。该网络应用由用户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阅读呢?谁是实际获取文件的用户?

修改 我发现了一个tomcat进程,它与我部署war的文件夹相关联。它确实由risdev运行,他应该拥有文件的权限。

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

enter image description here

1 个答案:

答案 0 :(得分:1)

检查以下条件:

  1. 必须使用risdev用户启动Tomcat才能访问此文件夹。
  2. 文件夹“/ rsrch1 / rists / moonshot / data / prod / foundation / xml /”及其中的所有文件必须具有risdev所有者(或其他人或相应组的读/写权限)。
  3. 作为参考,您可以使用以下命令检查正在运行的进程的所有者:

    ps -ef 
    

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

    ps -ef |grep java
    

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

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