Rumah > Soal Jawab > teks badan
Saya ingin menyediakan perkhidmatan web dengan Spring Boot yang boleh memuat turun dump daripada pangkalan data MySQL.
Tetapi muat turun tidak sepatutnya untuk semua orang. Jadi saya memerlukan sejenis log masuk. Tidak pasti di mana bukti kelayakan akan disimpan, kemungkinan ia hanya dikodkan dalam aplikasi itu sendiri.
Saya agak tersesat dan tidak tahu bagaimana untuk melaksanakan perkara ini.
Ini yang saya dapat setakat ini:
@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; } }
Pada masa ini pengawal memaparkan halaman log masuk di "/log masuk". Selepas menyerahkan borang, pengawal menyemak sama ada bukti kelayakan adalah betul dan jika tidak, memaparkan halaman log masuk sekali lagi dengan mesej ralat.
Tapi masalah saya, saya tak tahu nak buat apa selepas berjaya log masuk. Muat turun berfungsi dengan baik apabila saya memanggilnya secara terus, tetapi ia tidak berfungsi apabila menggunakan ubah hala kerana saya membuat permintaan pos untuk memastikan pengguna yang baru log masuk boleh memuat turun fail. Jika saya membuat permintaan get, semua orang boleh menggunakan pautan tersebut.
Saya mempunyai perasaan bahawa cara saya mendekati masalah adalah salah. Apakah yang akan anda cadangkan? Bagaimana untuk mula memuat turun selepas log masuk berjaya?
P粉5746952152024-03-29 00:48:53
Saya mengesyorkan menambahkan Spring Security pada projek anda dan mempunyai pengguna berkod keras di dalamnya:
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(); } }