【问题标题】:Permission denied for accessing file through restful api通过restful api访问文件的权限被拒绝
【发布时间】:2016-09-16 21:00:23
【问题描述】:

在我的 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服务器上部署了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 进程。它确实是由 risdev 运行的,他应该有权访问这些文件。

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

【问题讨论】:

    标签: rest tomcat permissions filesystems streaming


    【解决方案1】:

    检查以下条件:

    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/
    

    【讨论】:

    • 我附上了tomcat进程的屏幕截图,这是否意味着tomcat正在由risdev运行?
    • 是的。似乎 tomcat 实例以正确的用户运行。让我检查一下还有什么问题。
    • 我又仔细阅读了一遍,我看不到你已经确定你正在下载的文件有 rizdev 所有者。我已经更新了答案。
    • 我们不能让 risdev 成为该目录的所有者。但是,如我附上的第二个屏幕截图所示,risdev 拥有对该目录的读取权限。
    • 我看到的是 rwxr-xr-x。这意味着“其他人”只有执行权限,但没有读取权限。请检查 risdev 用户和目录所有者是否在同一组中。您需要设置权限 rwxr-xr-xr 或更改组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2021-09-16
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多