Я новичок в 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
пользовательское местоположение).