我正在使用 Apache MINA SSHD 库在 Spring Boot 应用程序中公开 SFTP 服务器,我想知道应该如何实现逻辑来防止某些文件被特定用户覆盖(更一般地说,防止在给定的文件中上传)目录,使其只读)。
我想它应该通过重写实现 SftpEventListener 的类中的方法来实现,使用会话检查经过身份验证的用户的用户名。
我尝试在给定用户名和路径的
writing
方法中抛出异常,但发生的情况如下:
我认为
writing
方法调用得太晚了,我应该寻找一个“开放写入”方法,但是 open
中的 SftpEventListener
似乎没有携带此信息。
谁能指出这个逻辑是如何实现的?
提前致谢!
好吧,经过更多调查后,我发现了这个问题 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");
}
}
}
希望它可以帮助遇到同样问题的人。