Selepas log masuk berjaya, Spring Boot Thymeleaf melaksanakan fungsi muat turun fail
P粉957661544
P粉957661544 2024-03-28 09:54:29
0
1
378

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

membalas semua(1)
P粉574695215

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();
    }
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan