Ограничение каталога с помощью JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ограничение каталога с помощью Java

Сообщение Anonymous »

Я пытаюсь создать приложение с использованием Java, которое ограничивает доступ на чтение и запись для каталога. Вот случай:
Есть серверный компьютер, доступный сотрудникам через IP-адрес через порт. Они хранят свои файлы в определенном каталоге, однако могут видеть и получать доступ к каждой папке и файлу в этом каталоге. Я хочу создать и развернуть приложение Spring Boot на этом компьютере, чтобы оно блокировало этот каталог и было доступно только через аутентификацию с помощью настольного приложения. Настольное приложение отправит запрос приложению Spring Boot, а затем разблокирует необходимые каталоги в зависимости от роли пользователя.
Я попробовал это, но, тем не менее, к каталогу можно получить доступ с разрешениями на чтение и запись:
package FileFlame.FileFlame.controller;

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
public class FileController {

private final Path rootDirectory = Paths.get("/Users/admin/Desktop/test_directory");

// Called when Spring Boot app starts. Block access to the directory initially
@GetMapping("/initialize")
public void initialize() {
blockDirectoryAccess();
}

// Block access to the directory
private void blockDirectoryAccess() {
File dir = rootDirectory.toFile();

if (dir.exists()) {
if (System.getProperty("os.name").toLowerCase().contains("win")) {
// For Windows: Deny access using icacls (deny full control to everyone)
try {
Process process = new ProcessBuilder("icacls", rootDirectory.toString(), "/deny", "everyone:(F)", "/T").start();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
} else {
// For Unix-based systems (e.g., macOS): Change permissions to block access
try {
// Change permissions to 000 recursively (no permissions)
Process process = new ProcessBuilder("chmod", "-R", "000", rootDirectory.toString()).start();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}

// Called after successful login: Unblock access to the directory
@GetMapping("/files")
public String listFiles(Model model) throws Exception {
// Ensure the user is authenticated and has the role
if (SecurityContextHolder.getContext().getAuthentication() != null) {
unblockDirectoryAccess();
var files = rootDirectory.toFile().list();
if (files != null) {
model.addAttribute("files", files);
}
return "files";
}
return "redirect:/login"; // Redirect to login if not authenticated
}

// Unblock access to the directory
private void unblockDirectoryAccess() {
File dir = rootDirectory.toFile();

if (dir.exists()) {
if (System.getProperty("os.name").toLowerCase().contains("win")) {
// For Windows: Grant full control to everyone again (unblock access)
try {
Process process = new ProcessBuilder("icacls", rootDirectory.toString(), "/grant", "everyone:(F)", "/T").start();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
} else {
// For Unix-based systems (e.g., macOS): Change permissions to allow access (755)
try {
// Change permissions to 755 recursively (owner can read/write/execute, others can read/execute)
Process process = new ProcessBuilder("chmod", "-R", "755", rootDirectory.toString()).start();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}

// Endpoint to download the file (after authentication)
@GetMapping("/files/{filename}")
public Resource downloadFile(@PathVariable String filename) throws Exception {
if (SecurityContextHolder.getContext().getAuthentication() != null) {
Path filePath = rootDirectory.resolve(filename).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (resource.exists()) {
return resource;
} else {
throw new RuntimeException("File not found: " + filename);
}
} else {
throw new RuntimeException("Unauthorized access.");
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... using-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»