Heim > Fragen und Antworten > Hauptteil
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粉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(); } }