如何授予在tomcat下运行的spring应用程序在另一个用户目录上写入的权限

时间:2017-03-15 02:59:49

标签: java linux spring-mvc tomcat permissions

在我的一个VPS上, 我在/opt/tomcat上使用用户tomcat:tomcat的tomcat服务器, 我有一个主机运行spring应用程序来为用户someuser的子域提供服务 即http://crm.someuser.com

现在我需要将文件/图像写入该文件夹/目录,即/home/someuser/crm.someuser.com, 每当我尝试写文件时,都会发生权限被拒绝异常。

3 个答案:

答案 0 :(得分:1)

文件系统权限问题。

简短回答,通过使用 chmod linux命令更改文件夹权限来授予目标文件夹的写入权限

e.g。

chmod ugoa + w /home/someuser/crm.someuser.com

当然你必须是该文件夹的所有者,如果不是至少你有sudo功能,那么你可以在该文件夹上执行chmod命令。

sudo ugoa + w /home/someuser/crm.someuser.com

在文件夹上执行list命令

ls -alh
-rw-r--r--  1 user user  675 Mar  14  2017 /home/someuser/crm.someuser.com 

执行chmod命令后,写入权限应显示类似

的内容
ls -alh
-rw-rw-rw-  1 user user  675 Mar  14  2017 /home/someuser/crm.someuser.com 

你会注意到该文件夹​​的rw(meaing read and write permissions)

答案很长,上面的答案将允许任何用户写入该文件夹,因为它具有用户,组和其他人的写入权限。一种好方法是只允许属于某个组的用户能够写入该文件夹。

E.g。根据您的使用情况,您可能希望将该用户添加到tomcat组并将该文件夹的所有者更改为tomcat。然后将tomcat组的写权限授予该文件夹。这样只有属于tomcat的用户才能写入该文件夹。

这是更新的解决方案。

创建一个有权写入这些文件夹的新组。

groupadd YOURGROUP

更改每个文件夹的组所有者。 (您可以按原样保留当前所有者,并通过在命令中传递相同的所有者来仅修改组)

sudo chown someuser:YOURGROUP /home/someuser/crm.someuser.com

更改该文件夹的权限,以便YOURGROUP具有读/写功能

sudo chmod g+rw /home/someuser/crm.someuser.com

最后,将tomcat添加到该组。因此tomcat将具有对这些文件夹的读/写功能。

sudo usermod -a -G YOURGROUP tomcat

其中tomcat是tomcat使用的有效用户(其他人使用tomcat7,你需要检查系统上tomcat的实际用户名)

答案 1 :(得分:0)

问题与Spring app无关;您只需为该文件夹上的tomcat用户设置读取,写入权限。您可以尝试使用:setfacl命令(http://manpages.ubuntu.com/manpages/zesty/en/man1/setfacl.1.html)或类似的东西。 E.x:

setfacl -m u:tomcat:rw /home/someuser/crm.someuser.com

希望它对你有所帮助。

答案 2 :(得分:0)

为我工作:

public Path getPathdoc(String filename) {
    //return Paths.get(UPLOADS_FOLDER).resolve(filename).toAbsolutePath();
    return Paths.get("/var/lib/mysql-files").resolve(filename).toAbsolutePath();
}

在这里,您将所有权限设置为:“ rwxrwxrwx”

 @Override
    public String copydoc(MultipartFile file) throws IOException {
        String uniqueFilename = file.getOriginalFilename();
        Path rootPath = getPathdoc(uniqueFilename);
        log.info("rootPath: " + rootPath);
        Files.copy(file.getInputStream(), rootPath);
        Files.setPosixFilePermissions(getPath(uniqueFilename), PosixFilePermissions.fromString("rwxrwxrwx"));
        return uniqueFilename;
    }