通过 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.
访问文件时权限被拒绝
检查以下条件:
- Tomcat 必须以 risdev 用户启动才能访问此文件夹。
- 文件夹“/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/
在我的网络应用程序中,我实现了一种在我的控制器中下载文件的方法:
@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.
检查以下条件:
- Tomcat 必须以 risdev 用户启动才能访问此文件夹。
- 文件夹“/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/