2016-09-16 200 views
1

訪問文件在我的web應用程序,我實現了一個方法來下載文件在我的控制器:權限被拒絕通過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實例的服務器上所有文件所在目錄的路徑。

我在tomcat服務器上部署了war。該網絡應用程序由用戶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進程,與我的戰爭部署的文件夾相關聯。它確實由誰應該擁有文件權限的risdev運行。

編輯#2 剛剛與在此服務器上安裝tomcat的管理員確認。他確實使用risdev來安裝tomcat實例,並在安裝後運行startup.sh。所以tomcat肯定是由risdev擁有和運行的。在同一臺服務器上,risdev通過命令行(ls和less)確認已明確具有訪問該文件夾中文件的權限。只是在通過tomcat訪問文件時權限被拒絕。

enter image description here

回答

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/ 
+0

我重視Tomcat進程的屏幕截圖,這是否意味着Tomcat是被'risdev'運行? – ddd

+0

是的。看來tomcat實例運行正確的用戶。讓我檢查還有什麼可能是錯的。 –

+0

我仔細閱讀,我看不到你已經確保你下載的文件有rizdev所有者。我已經更新了答案。 –