PreAuthorize возвращая код состояния 500 вместо 401 - PullRequest
0 голосов
/ 09 февраля 2019

Я использую JWT Spring security, я сделал простой пример, когда пользователь / администратор нажимает кнопку 2, чтобы проверить, правильно ли работает предварительная авторизация.Я понимаю, что «@PreAuthorize» при сбоях должен обрабатываться точкой входа аутентификации, но вместо того, чтобы возвращать мне статус 401, он возвращает мне статус 500.

enter image description here

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?Значит ли это, что я что-то неправильно отображаю?

...