Использование httpBasic с AuthenticationEntryPoint - PullRequest
0 голосов
/ 10 января 2019

Я следую этому руководству по использованию аутентификации JWT с пружинной загрузкой. Я могу войти в систему и получить доступ к API от почтальона, как показано в руководстве. Однако, когда я пытаюсь сделать то же самое из браузера на localhost: 8080, я получаю 401 Несанкционированную ошибку.

Метод конфигурирования, используемый в учебнике,

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable()
      .authorizeRequests().antMatchers("/api/auth/**").permitAll().anyRequest()
      .authenticated().and().exceptionHandling()
      .authenticationEntryPoint(unauthorizedHandler).and()
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}

Когда я удаляю authenticationEntryPoint и добавляю httpbasic, при входе в localhost: 8080 отображается диалоговое окно входа в систему.

@Override
protected void configure(HttpSecurity http) throws Exception { 
    http.cors().and().csrf().disable()
      .authorizeRequests().antMatchers("/api/auth/**").permitAll().anyRequest()
      .authenticated().and().exceptionHandling()
      .and().httpBasic().and().sessionManagement()
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

Но когда я пытаюсь добавить httpBasic с authenticationEntryPoint, диалог входа в систему не отображается.

@Override
protected void configure(HttpSecurity http) throws Exception {
      http.cors().and().csrf().disable()
        .authorizeRequests().antMatchers("/api/auth/**").permitAll().anyRequest()
        .authenticated().and().exceptionHandling()
        .authenticationEntryPoint(unauthorizedHandler)
        .and().httpBasic().and().sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

  http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}

Обновлено

unauthorizedHandler является реализацией AuthenticationEntryPoint.

@Component
public class UnauthorizedHandler implements AuthenticationEntryPoint {

    private static final Logger logger = LoggerFactory.getLogger(UnauthorizedHandler.class);

    @Override
    public void commence(HttpServletRequest request,
                     HttpServletResponse response,
                     AuthenticationException e) 
                             throws IOException, ServletException {

        logger.error("Unauthorized error. Message - {}", e.getMessage());
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Error -> Unauthorized");
}
* *} Тысяча двадцать-один

Как отобразить диалоговое окно входа при использовании AuthenticationEntryPoint?

1 Ответ

0 голосов
/ 10 января 2019

По умолчанию exceptionHandling включено и использует точку входа по умолчанию, которая равна Http403ForbiddenEntryPoint, когда вы настраиваете httpBasic(), она устанавливает новую точку входа по умолчанию в exceptionHandling, которая равна BasicAuthenticationEntryPoint - это все по умолчанию, когда определена не явно точка входа.

Когда вы явно определяете новую точку входа .exceptionHandling().authenticationEntryPoint(some entry point), вся конфигурация по умолчанию больше не используется и вместо нее будет использоваться some entry point.

Обратите внимание, что httpBasic все еще работает, но он должен как-то сообщить вашему браузеру, что аутентификация не удалась, и сказать браузеру запросить учетные данные пользователя для http basic, и это то, что делает BasicAuthenticationEntryPoint, установив соответствующий заголовок WWW-Authenticate: Basic realm="User Visible Realm".

В вашем UnauthorizedHandler в commence добавьте строки String realmName = "some text"; и response.addHeader("WWW-Authenticate", "Basic realm=\"" + realmName + "\"");

PS. Я не анализировал ваш случай, просто рассказал, что не так (почему не работает должным образом) и как заставить его работать - так что это решение может быть плохим с точки зрения безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...