1. 概要

このチュートリアルでは、Spring Security 認証プロバイダーを設定して、単純なUserDetailsServiceを使用した標準シナリオと比較して柔軟性を高める方法を示します。

2. 認証プロバイダー

Spring Securityは、認証を実行するためのさまざまなオプションを提供します。 これらは単純な契約に従います– 認証要求はAuthenticationProviderによって処理され、完全な資格情報を持つ完全に認証されたオブジェクトが返されます。

標準で最も一般的な実装は、 DaoAuthenticationProvider –単純な読み取り専用ユーザーDAO – UserDetailsServiceからユーザーの詳細を取得します。 このユーザー詳細サービスは、完全なユーザーエンティティを取得するために、ユーザー名にのみアクセスできます。 ほとんどのシナリオではこれで十分です。

さらに多くのカスタムシナリオでは、認証プロセスを実行できるようにするために、完全なAuthentication要求にアクセスする必要があります。 たとえば、外部のサードパーティサービス( Crowd など)に対して認証する場合–認証要求からのユーザー名とパスワードの両方が必要になります

これらのより高度なシナリオでは、カスタム認証プロバイダーを定義する必要があります。

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {
 
        String name = authentication.getName();
        String password = authentication.getCredentials().toString();
        
        if (shouldAuthenticateAgainstThirdPartySystem()) {
 
            // use the credentials
            // and authenticate against the third-party system
            return new UsernamePasswordAuthenticationToken(
              name, password, new ArrayList<>());
        } else {
            return null;
        }
    }

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

返されたAuthenticationオブジェクトに設定されている付与された権限が空であることに注意してください。 これは、当局がもちろんアプリケーション固有であるためです。

3. 認証プロバイダーを登録する

認証プロバイダーを定義したので、使用可能な名前空間サポートを使用して、XMLセキュリティ構成で認証プロバイダーを指定する必要があります。

<http use-expressions="true">
    <intercept-url pattern="/**" access="isAuthenticated()"/>
    <http-basic/>
</http>

<authentication-manager>
    <authentication-provider
      ref="customAuthenticationProvider" />
</authentication-manager>

4. Java構成

次に、対応するJava構成を見てみましょう。

@Configuration
@EnableWebSecurity
@ComponentScan("com.baeldung.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Autowired
    private CustomAuthenticationProvider authProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated()
            .and().httpBasic();
    }
}

5. 認証の実行

クライアントからの認証の要求は、バックエンドにこのカスタム認証プロバイダーがある場合とない場合で基本的に同じです。

簡単なcurlコマンドを使用して、認証されたリクエストを送信してみましょう。

curl --header "Accept:application/json" -i --user user1:user1Pass 
    http://localhost:8080/spring-security-custom/api/foo/1

この例では、基本認証を使用してRESTAPIを保護しました。

そして、サーバーから期待される200OKを取り戻します。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 02 Jun 2013 17:50:40 GMT

6. 結論

この記事では、SpringSecurityのカスタム認証プロバイダーの例について説明しました。

このチュートリアルの完全な実装は、GitHubプロジェクトにあります。