Spring Boot: отключить защиту для кода исключения состояния - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть приложение Spring Boot, с безопасностью.И я удалил аутентификацию для этого URL-адреса "/ login".

Моя конфигурация безопасности

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    private final JwtFilter jwtFilter;

    @Autowired
    public SecurityConfiguration(JwtFilter jwtFilter) {
        this.jwtFilter = jwtFilter;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .anonymous().and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .apply(new JwtConfigurerAdapter(jwtFilter)).and()
                .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs");
        web.ignoring().antMatchers("/login");
    }
}

Исключение My NotFound

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NotFound extends RuntimeException {
    public NotFound(String message) {
        super(message);
    }
}

Мой контроллер покоя с URL-адресом входаи исключение возвращаемое значение

@RestController
public class LoginController implements LoginService {
    @Override
    @GetMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
    public UserInfo loginUsingJson(String username, String password) {
        return findUser(username, password)).orElseThrow(() -> new NotFound("There does not exist any user by those credentials"));
    }
}

Хорошо, вот моя проблема.Когда я вызываю GET для «/ login» и UserInfo существует, он возвращает пользователя в формате JSON.Это работает из-за web.ignoring().antMatchers("/login");, но если пользователь не существует, исключение NotFound с http-кодом ошибки 404 не будет отображаться.Теперь он возвращает код ошибки 401 Not Authorized.

Я предполагаю, что это связано с HttpSecurity, где я должен добавить какое-то исключение или что-то еще, чтобы можно было вернуть код исключения.Но где я могу позволить игнорировать обработку исключений при авторизации HttpSecurity?

1 Ответ

0 голосов
/ 24 сентября 2018

Я нашел ответ и хотел бы помочь другим в такой же ситуации.

Моя проблема заключалась в том, что при возврате исключения покоя с кодом ошибки 404 NotFound Spring Boot автоматически перенаправляет на URL "/ошибка".Но эту карту URL нужно открыть для бизнеса.Поэтому мне пришлось игнорировать авторизацию для этого URL-адреса.

Здесь решение состоит в том, чтобы добавить это:

web.ignoring().antMatchers("/error");

А вот измененный класс:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    private final JwtFilter jwtFilter;

    @Autowired
    public SecurityConfiguration(JwtFilter jwtFilter) {
        this.jwtFilter = jwtFilter;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .anonymous().and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .apply(new JwtConfigurerAdapter(jwtFilter)).and()
                .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs");
        web.ignoring().antMatchers("/login");
        web.ignoring().antMatchers("/error");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...