Spring Security отвечает пустым телом с пустыми учетными данными аутентификации basi c - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь создать базовую c службу аутентификации, для некоторых бизнес-логи c мне нужно принять все учетные данные аутентификации basi c и заставить их обратиться к другой службе (и там произойдет сбой, если учетные данные неверны). Поэтому я пытаюсь сгенерировать исключение, если отсутствует базовый c auth или отсутствуют учетные данные.

Это мой SecurityConfigurer:

@Configuration
@EnableWebSecurity
public class SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Autowired
    STGAuthenticationProvider authProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests().anyRequest().authenticated()
        .and().httpBasic();
    }

}

А это мой CustomAuthProvider :

    @Component
    public class STGAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        String username = authentication.getName();
        String password = authentication.getCredentials().toString();


        if(!StringUtils.isBlank(username) && !StringUtils.isBlank(password)) {
            return new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());
        } else {
            throw new STGNoCredentialsException(Constants.Error.NO_CREDENTIALS);
        }

    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

}

На самом деле мое приложение выдает мне «401 несанкционированный», если я отправляю запрос без авторизации (я бы очень хотел получить свое собственное исключение, которое вы можете увидеть на моем CustomAuthProvider). И когда я отправляю только 1 учетную запись (имя пользователя или пароль) или никого, моя служба отвечает мне пустым телом на POSTMAN. Ребята, вы можете мне помочь?

1 Ответ

1 голос
/ 13 февраля 2020

Насколько я понимаю, ваша проблема похожа на ту, что у меня была несколько дней go: мне нужно было возвращать 401 вместо 403 всякий раз, когда конечная точка вызывалась без авторизации или с истекшим токеном авторизации.
Что касается вашего кода, я бы добавил .exceptionHandling (). AuthenticationEntryPoint (...) в ваш WebSecurityConfigurerAdapter следующим образом

@Configuration
@EnableWebSecurity
public class SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    /* other stuff */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests().anyRequest().authenticated()
        .and().httpBasic()
        .exceptionHandling().authenticationEntryPoint(/*custom exception*/);
    }
}

, а затем вместо / * пользовательского исключения * / добавить что-то как new MyAuthException(), где MyAuthException выглядит следующим образом:

@Component
public class MyAuthException implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException authException) /*throws ...*/ {
        response.setStatus(/* your status */);
        response.getWriter().write(/*the body of your answer*/);
        /* whatever else you want to add to your response */
        /* or you could throw an exception, I guess*/
    }
}

(я не помню, и сейчас я не могу проверить, нужно ли этот класс отмечать как @Component, думаю нет).

...