Код ответа фильтра переопределяется фильтрами по умолчанию - PullRequest
0 голосов
/ 05 апреля 2019

Я возвращаю код ошибки и сообщение, используя метод HttpServletResponse.sendError , как показано ниже. Он возвращает 403 Запрещено , даже если я установил 401 код состояния.

Я использую spring-boot-2.1.2.RELEASE с защитой Spring.

Я пытался прочитать много SO q & a и пытался отлаживать приложение, но не могу найти, почему HttpResponseCode переопределяется. При отладке код состояния переопределяется в ErrorReportValve классе.

Вот мой фильтр:

@Component
public class AuthenticationTokenFilter extends OncePerRequestFilter {

    private final Logger logger = Logger.getLogger(getClass());

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {      
        try {
            test(request.getRequestURI());

            SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
            List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>();
            updatedAuthorities.add(authority);

            Authentication auth = new UsernamePasswordAuthenticationToken
                    ("user", "", updatedAuthorities); 

            SecurityContextHolder.getContext().setAuthentication(auth);
            filterChain.doFilter(request, response);
            return;
        } catch(InternalError e) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());
            return;
        }       
    }

    public String test(String uri) throws InternalError {
        if(uri.equalsIgnoreCase("/error/pass")) {
            return uri;
        } else {
            throw new InternalError("Failing");
        }
    }
}

WebSecurityConfig


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationTokenFilter authFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .anyRequest().authenticated()
            .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
                .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
                .cors()
            .and()
                .csrf().disable();
    }

}

Контроллер

@RestController
public class TestController {

    @GetMapping("/")
    public String health() {
        return "Healthy";
    }

    @GetMapping("/error/{status}") 
    public String error(@PathVariable String status) throws IOException {
        return status;
    }

}

Ответ Postman Response

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...