2017-05-18 7 views
0

ユーザー名がデータベースに存在するかどうかを確認し、ADに対して認証する必要があります。 usernameが存在しない場合、アプリケーションはADに対して認証しようとする代わりにエラーを返します。私は複数のADやデータベースに対して認証していますが、これを動作させるのに問題があります。ヒントがあれば助かります。ありがとうSpring Security - まずDBのユーザーを確認してからADに対して認証します。

WebSecurityConfigurerAdapter私のクラスではauthenticationProviderで試してみましたが、DBの存在を確認できました。しかし、認証がLDAPに進むことができるように何を返すべきかは不明です。

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
auth 
    .authenticationProvider(authenticationProvider) 
    .authenticationEventPublisher(authenticationEventPublisher) 
    .ldapAuthentication() 
    .....; 

は}

Iはまた、追加しようとした前/後のフィルタが、そこに成功していないのいずれか()メソッドFirewalledRequestのdoFilter渡されたリクエストのインスタンスpreAuthenticationFilterフィルタにおいて

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
    .... 
.and() 
.addFilterBefore(preAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) 
; 

答えて

0

。この例からは、ユーザー名を取得できません。これは設計通りです。 FirewalledRequestのインスタンスからユーザー名を取得する方法に関するアドバイスがありましたら、ここにお知らせください。私はそれを試してみましょう。

フィルタを使用する代わりに、私はカスタムAuthenticationProviderでプレイすることに決めました。 authenticate()メソッドの下のAuthenticationProvider実装では、ユーザーが存在するときにnull(およびlog、notifyなど)を返します。ユーザーが終了しない場合は、同じ認証インスタンスが返されます。これはチェーンを破壊し、ADに対する認証への進行を止める。 Spring Securityがこの例外を捕捉してさらに進めば(Authentication)、AuthenticationExceptionのインスタンスを投げることはできません。ここで

は、コードスニペットは、任意のより良いアイデアを共有してください

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException 
{ 
    Optional<User> user = service.findUserByUsername((String) authentication.getPrincipal()); 

    if (user.isPresent()) 
     return null; 

    return authentication; 
} 

どのように見えるかです。

関連する問題