Nach erfolgreicher Anmeldung implementiert Spring Boot Thymeleaf die Funktion zum Herunterladen von Dateien
P粉957661544
P粉957661544 2024-03-28 09:54:29
0
1
377

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

Antworte allen(1)
P粉574695215

我建议将 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();
    }
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage