Apache MINA SSHD:SFTP 服务器:防止特定路径的文件覆盖

问题描述 投票:0回答:1

我正在使用 Apache MINA SSHD 库在 Spring Boot 应用程序中公开 SFTP 服务器,我想知道应该如何实现逻辑来防止某些文件被特定用户覆盖(更一般地说,防止在给定的文件中上传)目录,使其只读)。

我想它应该通过重写实现 SftpEventListener 的类中的方法来实现,使用会话检查经过身份验证的用户的用户名。

我尝试在给定用户名和路径的

writing
方法中抛出异常,但发生的情况如下:

  • 上传新文件时,上传失败但仍创建0字节文件
  • 上传已存在的文件时,上传失败但现有文件被截断为0字节

我认为

writing
方法调用得太晚了,我应该寻找一个“开放写入”方法,但是
open
中的
SftpEventListener
似乎没有携带此信息。

谁能指出这个逻辑是如何实现的?

提前致谢!

java apache-mina apache-sshd
1个回答
0
投票

好吧,经过更多调查后,我发现了这个问题 SSHD-731,它描述了非常相似的情况。

查看在commit中所做的更改来修补它,可以看到如何检测“打开以进行写入”操作。必须在

opening
SftpEventListener
方法中完成,如下所示:

@Override
    public void opening(ServerSession serverSession, String remoteHandle, Handle localHandle) throws IOException {
        if (localHandle instanceof FileHandle fileHandle) {
            if (GenericUtils.containsAny(fileHandle.getOpenOptions(), IoUtils.WRITEABLE_OPEN_OPTIONS)
                    && localHandle.toString().startsWith(this.storageReportsDirectoryPathString)
                    && /* Custom condition like "file is inside a given read-only directory" */) {
                throw new AccessDeniedException("Operation not permitted for the authenticated user");
            }
        }
    }

希望它可以帮助遇到同样问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.