Я использую JWT Spring security, я сделал простой пример, когда пользователь / администратор нажимает кнопку 2, чтобы проверить, правильно ли работает предварительная авторизация.Я понимаю, что «@PreAuthorize» при сбоях должен обрабатываться точкой входа аутентификации, но вместо того, чтобы возвращать мне статус 401, он возвращает мне статус 500.
My WebSecurityConfig:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// we don't need CSRF because our token is invulnerable
.csrf().disable()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// don't create session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
// Un-secure H2 Database
.antMatchers("/h2-console/**/**").permitAll()
.antMatchers("/auth/**").permitAll()
.anyRequest().authenticated();
httpSecurity
.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// disable page caching
httpSecurity
.headers()
.frameOptions().sameOrigin() // required to set for H2 else H2 Console will be blank.
.cacheControl();
}
@Override
public void configure(WebSecurity web) throws Exception {
// AuthenticationTokenFilter will ignore the below paths
web
.ignoring()
.antMatchers(
HttpMethod.POST,
authenticationPath
)
// allow anonymous resource requests
.and()
.ignoring()
.antMatchers(
HttpMethod.GET,
"/",
"/**",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js"
)
// Un-secure H2 Database (for testing purposes, H2 console shouldn't be unprotected in production)
.and()
.ignoring()
.antMatchers("/h2-console/**/**");
}
AuthenticationEntryPoint
@Override
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {
// This is invoked when user tries to access a secured REST resource without supplying any credentials
// We should just send a 401 Unauthorized response because there is no 'login page' to redirect to
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
Мой контроллер:
@RequestMapping(value = "/testa", method = RequestMethod.GET)
public ResponseEntity<?> getProtectedGreetinga() {
return ResponseEntity.ok("THIS IS A NORMAL USER!!");
}
@RequestMapping(value = "/testb", method = RequestMethod.GET)
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<?> getProtectedGreetingb() {
return ResponseEntity.ok("THIS IS AN ADMIN!!");
}
Из приведенного выше изображения видно, что я получаю доступотказано, но почему я получаю статус 500?Значит ли это, что я что-то неправильно отображаю?