suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Nach erfolgreicher Anmeldung implementiert Spring Boot Thymeleaf die Funktion zum Herunterladen von Dateien

Ich möchte mit Spring Boot einen Webdienst bereitstellen, der Dumps aus einer MySQL-Datenbank herunterladen kann.

Aber das Herunterladen sollte nicht jedermanns Sache sein. Ich brauche also eine Art Login. Ich bin mir nicht ganz sicher, wo die Anmeldeinformationen gespeichert werden. Möglicherweise sind sie nur in der Anwendung selbst fest codiert.

Ich bin etwas ratlos und weiß nicht, wie ich das umsetzen soll.

Das habe ich bisher bekommen:

@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;
    }

}

Derzeit zeigt der Controller die Anmeldeseite unter „/login“ an. Nach dem Absenden des Formulars prüft der Verantwortliche, ob die Anmeldedaten korrekt sind und zeigt andernfalls erneut die Anmeldeseite mit einer Fehlermeldung an.

Aber mein Problem ist, dass ich nicht weiß, was ich tun soll, nachdem ich mich erfolgreich angemeldet habe. Der Download funktioniert gut, wenn ich ihn direkt aufrufe, aber nicht, wenn ich eine Weiterleitung verwende, weil ich eine Post-Anfrage mache, um sicherzustellen, dass der Benutzer, der sich gerade angemeldet hat, die Datei herunterladen kann. Wenn ich eine Get-Anfrage stelle, kann jeder den Link nutzen.

Ich habe das Gefühl, dass meine Herangehensweise an das Problem falsch ist. Was würden Sie empfehlen? Wie starte ich den Download nach erfolgreicher Anmeldung?

P粉957661544P粉957661544271 Tage vor380

Antworte allen(1)Ich werde antworten

  • P粉574695215

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

    我建议将 Spring Security 添加到您的项目中,并在其中有一个硬编码的用户:

    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();
        }
    }

    Antwort
    0
  • StornierenAntwort