Получение файлов из бэкэнда Springboot + Spring Security в Angular front - PullRequest
0 голосов
/ 11 января 2019

Я новичок в Angular и Spring Security, и я следовал этому руководству для загрузки / выгрузки файлов с помощью Springboot и Angular. В этом уроке они не используют Spring Security (просто Angular + Springboot). Тем не менее, я могу загружать файлы, используя три технологии вместе.

Проблема: Я не могу не скачивать файлы со ссылками как в учебнике

Что я получаю как сообщение об ошибке:

401 unathorized http error

говорит, что мне нужна полная аутентификация для доступа к ресурсу localhost:8080/api/manage/download, который указывает на метод get для загрузки файла, как показано в руководстве:

@GetMapping("/download")
@ResponseBody
public ResponseEntity<?> getFile() throws IOException, URISyntaxException{
    // just an example of an image resource to test
    Resource file = storageService.loadAsResource("d.jpg");
    // the resource is not null
    // I can see it when debugging 
    // which mean i should receive it as a response body
     return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;     filename=\"" + file.getFilename() + "\"")
            .body(file);

    }

Конфигурация Websecurity:

  @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
    prePostEnabled = true
 )
  public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsServiceImpl userDetailsService;

@Autowired
private JwtAuthEntryPoint unauthorizedHandler;

@Bean
public JwtAuthTokenFilter authenticationJwtTokenFilter() {
    return new JwtAuthTokenFilter();
}

@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
    authenticationManagerBuilder
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable().
            authorizeRequests()
            .antMatchers("/api/auth/**").permitAll() 
            .and()
            .authorizeRequests()
            .antMatchers("/api/manage/**").authenticated()
            .and()
            .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}
     }

Как вы можете видеть, я должен получить доступ к ресурсу при аутентификации.

Дополнительное описание: Я не могу получить доступ к указанному ресурсу напрямую из браузера или по ссылке даже после успешной аутентификации. Но я могу получить к нему доступ с помощью этого углового запроса от службы:

showFile(): any {
return this.http.get<any>("http://localhost:8080/api/manage/download");
}

Но я не знаю, как использовать результат как файл в Angular (даже я не предпочитаю этот подход, я скорее предпочитаю получать его со ссылкой, как в учебнике), потому что я не вижу ничего конвертируемого в BLOB-объект или файл в результате, как вы можете видеть ниже, тело имеет значение null:

Response : {"_isScalar":false,"source":{"_isScalar":false,"source":{"_isScalar":false,"source":{"_isScalar":true,"value":{"url":"http://localhost:8080/api/manage/download","body":null,"reportProgress":false,"withCredentials":false,"responseType":"json","method":"GET","headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"params":{"updates":null,"cloneFrom":null,"encoder":{},"map":null},"urlWithParams":"http://localhost:8080/api/manage/download"}},"operator":{"concurrent":1}},"operator":{}},"operator":{}}

Почему я думаю, что проблема может быть связана с безопасностью пружины:

Потому что работает без использования

Что я уже пробовал:

Я обнаружил некоторые похожие проблемы, но все они касались доступа к файлам из пользовательского местоположения с помощью Spring Security, и решение было включить этот доступ в конфигурации WebSecurity. Я не нашел в этом проблемы для меня, потому что, как я уже сказал, я могу загрузить ресурс (из upload-dir пользовательское местоположение).

...