HttpClientを3種類のHTTP基本認証の認証を、あなたはまだ理解できますか?

HTTP基本紹介

HTTPは、アクセス制御や認証のための共通のフレームワークを提供します。最も一般的なHTTP認証方式は、HTTP基本認証です。ログイン認証HTTP基本認証の一種は、Webブラウザや他のクライアントプログラムが要求資格の形式でユーザー名とパスワードを提供できるようにする方法です。

利点

  • 基本認証の一つの利点は、基本的にすべての一般的なWebブラウザが基本認証をサポートしていることです。基本認証ではめったに時々小さなプライベートシステムに(ルータのWeb管理インターフェイスとして)を使用し、公的にアクセス可能なインターネットサイト上で使用されていません。その後、HTTP認証機構をダイジェストを安全でないチャネルを介して送信される、比較的安全な方法で鍵をできるように、基本認証に代わるものとして開発されています。
  • プログラマやシステム管理者は、時々手動でWebサーバーをテストするためにTelnetまたは他のネットワークプロトコル明示ツールを使用して、信頼できるネットワーク環境で基本認証を使用します。これは面倒なプロセスであるが、ネットワークを介して送信されるコンテンツは、診断目的のために、人間が読める形式です。

短所

  • 基本的な認定はつまり、実装するのは非常に簡単ですが、プログラムは以下の仮定に基づいて作成されますが:クライアントおよびサーバーのホスト間の接続は、安全で信頼性の高いです。具体的には、SSL / TLSトランスポート層セキュリティ場合は、このプロトコルが使用されていない、そしてそれが傍受に対して脆弱である明確に送信したパスワードをキーに。このプログラムは、サーバから返された情報の保護を提供していません。
  • 既存の認証ブラウザタブまたはブラウザを閉じるまで保存された情報やユーザ履歴のクリア。HTTPサーバのためにこれらのキャッシュされたキーを破棄するようにクライアントを指示するための方法を提供していません。これは、ケース内のサーバーは、ユーザーが、ユーザーがログアウトしてみましょうするための効果的な方法を、ブラウザを閉じて、ないないことを意味します

上記でHttp Basic簡単な紹介、それが今日の私たちの話題ではありません、私たちの話題今日はです:HttpClient三種類のHttp Basic Authentication3つの認証方式であることの認証、?次に我々はアナログHTTP基本サーバーから起動し、それをチェックアウトして行きました。

HTTP基本サーバー

私たちは、SpringBootを使用して、春のセキュリティは、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を


この時点で、私たちのHTTP基本サーバが完了している設定されます

HttpClientを3種類のHTTP基本認証

標準モード

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);
}

これらは、3つのHttpClientをHTTP基本認証されている、私はあなたの助けを願っています。

記事の不備は、ポインティングの多くは、一緒に学ぶことを願って、共通の進捗状況

ソースコードはこちら

遂に

一緒に進歩「技術的ボーエンのフラットヘッドの兄」:少し宣伝を再生する、マイクロチャンネルスキャンコード番号の公衆に焦点を歓迎しました。
技術的ボーエンのマイナス弟

おすすめ

転載: www.cnblogs.com/jamaler/p/11457077.html
おすすめ