HttpServletRequest имеет значение null при использовании фильтра для JWT, заголовки работают на почтальоне, но не на localhost - PullRequest
1 голос
/ 25 апреля 2020

Я использую React для внешнего интерфейса и Java пружинный ботинок для внутреннего интерфейса. Мой API работал до того, как я использовал Bcrypt для кодирования паролей, но теперь, похоже, существует проблема с внутренним фильтром перед каждым вызовом API, когда ответ нулевой ...

Это мой WebSecurityConfig. java


@EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService myUserDetailsService;
        @Autowired
        private JwtRequestFilter jwtRequestFilter;

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncode());
        }

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

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

        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
            httpSecurity.csrf().disable()
                    .authorizeRequests().antMatchers("/authenticate").permitAll()
                    .antMatchers("/personInfo").permitAll()
                    .antMatchers("/signup").permitAll().
                            anyRequest().authenticated().and().
            addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class).exceptionHandling();

        }

    }

и это мой JWTRequestFilter. java

Я думал, что это может быть связано с passwordEncoder (), потому что мои вызовы работали, когда я не использовал BcryptPasswordEncoder () ...

@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        if(request == null){
            System.out.println("request is null");
        }

        final String authorizationHeader = request.getHeader("Authorization");

        String username = null;
        String jwt = null;

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            jwt = authorizationHeader.substring(7);
            username = jwtUtil.extractUsername(jwt);
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {

            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if (jwtUtil.validateToken(jwt, userDetails)) {

                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken
                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request, response);
    }

}

я использую реагирование для внешнего интерфейса и звоню с топором ios

async totals(){
        console.log('Bearer ', localStorage.getItem('id_token'));
        let data = await axios.get("http://localhost:8080/totals", {
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + localStorage.getItem('id_token')
            }
        })
            .then(this._checkStatus);

        return data.request.response;
    }

API работает, когда я использую токен в почтальоне и так проблема между начальным запросом и фильтром ...

ошибка, которую я получаю - Доступ к XMLHttpRequest по адресу http://localhost: 8080 / итоги 'из источника' http://localhost: 3000 'заблокировано политикой CORS: Ответ на предполётный запрос не проходит проверку контроля доступа: У него нет статуса HTTP ok.

спасибо за ваше время:)

1 Ответ

0 голосов
/ 29 апреля 2020

Если кто-нибудь когда-нибудь получит такую ​​же проблему, я решил ее, добавив эту строку в конце моего метода configure (HttpSecurity httpSecurity) в WebSecurityConfig. java

httpSecurity.cors ();

:)

...