Я возвращаю код ошибки и сообщение, используя метод 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;
}
}
Ответ