Введение в Http Basic
HTTP обеспечивает общую основу для контроля авторизации и аутентификации. Наиболее часто используемой схемой аутентификации HTTP является базовая аутентификация HTTP. Обычная HTTP-аутентификация — это метод аутентификации при входе, который позволяет веб-браузерам или другим клиентским программам предоставлять учетные данные в виде имен пользователей и паролей по запросу.
преимущество
- Одним из преимуществ базовой аутентификации является то, что практически все популярные веб-браузеры поддерживают базовую аутентификацию. Обычная проверка подлинности редко используется на общедоступных интернет-сайтах и иногда используется в небольших частных системах (таких как веб-интерфейсы управления маршрутизаторами). Более поздний механизм, HTTP Digest Authentication, был разработан как альтернатива Basic Authentication, позволяя передавать ключи по незащищенным каналам относительно безопасным способом.
- Программисты и системные администраторы иногда используют базовую аутентификацию в доверенных сетевых средах для ручного тестирования веб-серверов с помощью Telnet или других инструментов сетевого протокола с открытым текстом. Это громоздкий процесс, но то, что передается по сети, удобочитаемо для диагностических целей.
недостаток
- Хотя базовую аутентификацию очень легко реализовать, схема построена на предположении, что соединение между хостами клиента и сервера является безопасным и надежным. В частности, ключи и пароли, передаваемые в открытом виде, могут быть легко перехвачены, если не используется протокол безопасности транспортного уровня, такой как SSL/TLS. Это решение также не обеспечивает защиту информации, возвращаемой сервером.
- Существующие браузеры сохраняют данные аутентификации до тех пор, пока вкладка или браузер не будут закрыты или пользователь не очистит историю. HTTP не позволяет серверу указать клиенту отказаться от этих кэшированных ключей. Это означает, что на стороне сервера нет эффективного способа выйти из системы без закрытия браузера.
вышеHttp Basic
, это не наша сегодняшняя тема, наша сегодняшняя тема:HttpClient
триHttp Basic Authentication
Каковы три метода аутентификации? Теперь давайте рассмотрим поближе.Мы начнем с макета Http Basic-сервера.
HTTP базовый сервер
Мы используем SpringBoot и Spring Security, чтобы просто создать сервис с базовой HTTP-аутентификацией. Конкретный процесс сборки описывать не буду, сначала выложу сюда код ключа для облегчения понимания, полный код выложен наGitHub
Выше есть ссылка в конце статьи.
Настройка BasicAuthenticationEntryPoint
@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.addHeader("WWW-Authenticate", "Basic realm=" + getRealmName());
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter printWriter = new PrintWriter(response.getOutputStream());
printWriter.write("Http Status 401: " + authException.getLocalizedMessage());
}
@Override
public void afterPropertiesSet() throws Exception {
setRealmName("developlee");
super.afterPropertiesSet();
}
}
Настроить WebSecurityConfigurer
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyBasicAuthenticationEntryPoint authenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
// 开启httpBasic
.httpBasic()
// 设置 BasicAuthenticationFilter
.authenticationEntryPoint(authenticationEntryPoint);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("jamal").password(passwordEncoder().encode("123456")).authorities("ROLE_USER");
}
@Bean
protected PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Написать контроллер
@RestController
public class WebController {
@RequestMapping(path = "/hello")
public String hello(){
return "验证通过";
}
}
Запустите проект, посетитеhttp://127.0.0.1:8080/hello
HttpClient три метода аутентификации Http Basic
стандартный режим
private String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://127.0.0.1:8080/hello";
private String DEFAULT_USER = "jamal";
private String DEFAULT_PASS = "123456";
@Test
public void CredentialsProvider()throws Exception{
// 创建用户信息
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials
= new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS);
provider.setCredentials(AuthScope.ANY, credentials);
// 创建客户端的时候进行身份验证
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
HttpResponse response = client.execute(
new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION));
int statusCode = response.getStatusLine()
.getStatusCode();
Assert.assertEquals(statusCode,200);
}
упреждающий режим
@Test
public void PreemptiveBasicAuthentication()throws Exception{
// 先进行身份验证
HttpHost targetHost = new HttpHost("localhost", 8080, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS));
AuthCache authCache = new BasicAuthCache();
// 将身份验证放入缓存中
authCache.put(targetHost, new BasicScheme());
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(
new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION), context);
int statusCode = response.getStatusLine().getStatusCode();
Assert.assertEquals(statusCode,200);
}
Собственный базовый режим Http
@Test
public void HttpBasicAuth()throws Exception{
HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION);
// 手动构建验证信息
String auth = DEFAULT_USER + ":" + DEFAULT_PASS;
byte[] encodedAuth = Base64.encodeBase64(
auth.getBytes(StandardCharsets.UTF_8));
String authHeader = "Basic " + new String(encodedAuth);
// 将验证信息放入到 Header
request.setHeader(HttpHeaders.AUTHORIZATION, authHeader);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(request);
int statusCode = response.getStatusLine().getStatusCode();
Assert.assertEquals(statusCode,200);
}
Выше приведены три метода проверки HttpClient Http Basic, я надеюсь помочь вам.
Что касается недостатков статьи, я надеюсь, что вы можете дать больше указаний, учиться вместе и вместе добиваться прогресса.
исходный кодкликните сюда
Наконец
Сделайте небольшую рекламу, добро пожаловать, чтобы отсканировать код и подпишитесь на общедоступную учетную запись WeChat: «Технический блог брата Пинтоу», давайте вместе добьемся прогресса.