Après une connexion réussie, Spring Boot Thymeleaf implémente la fonction de téléchargement de fichiers
P粉957661544
P粉957661544 2024-03-28 09:54:29
0
1
379

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粉957661544
P粉957661544

répondre à tous(1)
P粉574695215

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();
    }
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal