Je souhaite fournir un service Web avec Spring Boot capable de télécharger des dumps à partir d'une base de données MySQL.
Mais le téléchargement ne devrait pas être pour tout le monde. J'ai donc besoin d'une sorte de connexion. Je ne sais pas exactement où les informations d'identification seront stockées, il est possible qu'elles soient simplement codées en dur dans l'application elle-même.
Je suis un peu perdu et je ne sais pas comment mettre cela en œuvre.
Voici ce que j'ai obtenu jusqu'à présent :
@Controller public class EBMysqldumpController { private EBMysqldumpService mysqldumpService; @Autowired public EBMysqldumpController(EBMysqldumpService mysqldumpService) { this.mysqldumpService = mysqldumpService; } @GetMapping("/login") public String showLoginForm(Model model) { model.addAttribute("userDto", new UserDto()); return "mysqldump-login"; } @PostMapping(path = "/login") public String validateLoginForm(@Valid UserDto userDto, BindingResult result, HttpServletRequest request) { if (result.hasErrors()) { return "mysqldump-login"; } if (!this.mysqldumpService.checkLogin(userDto)) { result.addError(new ObjectError("", "Wrong username and/or password")); return "mysqldump-login"; } return "redirect:/file"; } @PostMapping(path = "/file") public ResponseEntity<Resource> startMysqlDump(@Valid UserDto userDto, Model model) throws IOException, InterruptedException, MysqldumpException { if (!this.mysqldumpService.checkLogin(userDto)) { return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } File mysqlDump = this.mysqldumpService.getMysqlDumpFile(); ByteArrayResource byteArrayResource = this.mysqldumpService.getByteArrayResourceFromFile(mysqlDump); HttpHeaders headers = getMysqldumpHeaders(mysqlDump.getName()); ResponseEntity<Resource> body = ResponseEntity.ok() .headers(headers) .contentLength(mysqlDump.length()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(byteArrayResource); this.mysqldumpService.deleteFile(mysqlDump); return body; } private HttpHeaders getMysqldumpHeaders(String filename) { ContentDisposition contentDisposition = ContentDisposition.inline().filename(filename).build(); HttpHeaders headers = new HttpHeaders(); headers.setContentDisposition(contentDisposition); return headers; } }
Actuellement, le contrôleur affiche la page de connexion à "/login". Après avoir soumis le formulaire, le contrôleur vérifie si les informations d'identification sont correctes et, dans le cas contraire, affiche à nouveau la page de connexion avec un message d'erreur.
Mais mon problème est que je ne sais pas quoi faire une fois connecté avec succès. Le téléchargement fonctionne bien lorsque je l'appelle directement, mais cela ne fonctionne pas lors de l'utilisation d'une redirection car je fais une demande de publication pour m'assurer que l'utilisateur qui vient de se connecter peut télécharger le fichier. Si je fais une demande d'obtention, tout le monde peut utiliser le lien.
J'ai le sentiment que la façon dont j'aborde le problème est mauvaise. Que recommanderais-tu? Comment démarrer le téléchargement après une connexion réussie ?
Je recommande d'ajouter Spring Security à votre projet et d'y avoir un utilisateur codé en dur :