Maison  >  Questions et réponses  >  le corps du texte

Après une connexion réussie, Spring Boot Thymeleaf implémente la fonction de téléchargement de fichiers

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 ?

P粉957661544P粉957661544205 Il y a quelques jours308

répondre à tous(1)je répondrai

  • P粉574695215

    P粉5746952152024-03-29 00:48:53

    Je recommande d'ajouter Spring Security à votre projet et d'y avoir un utilisateur codé en dur :

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.password.NoOpPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @Configuration
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .passwordEncoder(passwordEncoder)
                .withUser("user1").password("my-secret-pwd").roles("USER");
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests(
                        registry -> registry.mvcMatchers("/**").authenticated()
                )
                .formLogin();
        }
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return NoOpPasswordEncoder.getInstance();
        }
    }

    répondre
    0
  • Annulerrépondre