:要求レベルに私はどの方法(利用者サービス)のいずれかで使用するために区別したいと思います複数のエントリポイントを設定します。つまり、複数の認証方法を持つことができます。された次のサンプルコード:
DBUSERエントリポイント:
public class DBUserAuthencticationEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request,
HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException {
super.commence(request, response, authException);
}
}
LDAPエントリポイント:
public class LDAPAuthencticationEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request,
HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException {
super.commence(request, response, authException);
}
}
次にあなたが(正しいエントリポイントを選択するRequestMatcher
Sを作成する必要がありますヘッダー/領域名に基づいて):
DBUSER要求マッチャ:
RequestMatcher dbUserMatcher = new RequestMatcher() {
@Override
public boolean matches(HttpServletRequest request) {
// Logic to identify a DBUser kind of reqeust
}
};
LDAPユーザーrequsetマッチャ:
RequestMatcher ldapMatcher = new RequestMatcher() {
@Override
public boolean matches(HttpServletRequest request) {
// Logic to identify a LDAP kind of reqeust
}
};
今、私たちは、DelegatingAuthenticationEntryPoint
にこれらのmatcherとエントリポイントを追加する必要があります。実行時にDelegatingAuthenticationEntryPoint
はエントリポイントを取得し、true
を返す正規表現に基づいて認証を行います。プロバイダ管理設定
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests().
regexMatchers("/login.*").permitAll().
regexMatchers("/api.*").fullyAuthenticated().
and().
formLogin().loginPage("/login").
and().
exceptionHandling().authenticationEntryPoint(delegatingAuthenticationEntryPoint);
}
}
:
DBUserAuthencticationEntryPoint dbUserEntryPoint = new DBUserAuthencticationEntryPoint();
LDAPAuthencticationEntryPoint ldapEntryPoint = new LDAPAuthencticationEntryPoint();
LinkedHashMap<RequestMatcher,AuthenticationEntryPoint> entryPoints = new LinkedHashMap<RequestMatcher,AuthenticationEntryPoint>();
entryPoints.put(ldapMatcher, ldapEntryPoint);
entryPoints.put(dbUserMatcher, dbUserEntryPoint);
DelegatingAuthenticationEntryPoint delegatingAuthenticationEntryPoint = new DelegatingAuthenticationEntryPoint(entryPoints);
今configure()
方法でHttpSecurity
にDelegatingAuthenticationEntryPoint
をマップ
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Arrays.asList(provider1, provider2);
}
OKをインスタンス化するためにどの認証クラスを区別するためにTokenRequestオブジェクトを使用することができます
:私の場合、私はそれを「パスワード」助成金をサポートしていることを意味しているResourceOwnerPasswordTokenGranterを拡張しましたカスタム認証ページ(HTTP RealmNameヘッダーなど)にリダイレクトできるかどうかを確認します。 残念ながら認証ページは提供しませんが、OAuth APIのみを提供します。リクエストが来たときに、RealmNameヘッダーに基づいて適切な認証プロバイダを選択し、Authorization httpヘッダーの資格情報を使用して認証する必要があります。 – Konrad
いいえ、これはあらゆる種類の認証プロセスで動作します。デモのためにフォームベースのログインをしました。フォームベースのログインコードを削除し、 'http.authenticationProvider(authenticationProvider)'を呼び出すことで認証プロバイダを設定してください – Mithun
しかし、標準のOauthフローを使用して、org.springframework.security.authentication.ProviderManagerをユーザ固有の認証マネージャ。私は認証エントリーポイントからそれを行うことができません。 – Konrad