Waffle を使用して認証する Spring MVC アプリケーションを作成しています。構成に成功し、正常に動作しますが、ブラウザーがネットワーク資格情報を自動的に送信しない場合は、ブラウザーのポップアップの代わりにカスタム フォームを使用したいと考えています。
formLogin()
既存の認証を使用することを期待して使用するように構成を変更しましたが、うまくいきません。
package com.zeroalpha.waffledemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import waffle.spring.NegotiateSecurityFilter;
import waffle.spring.NegotiateSecurityFilterEntryPoint;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
@Autowired
private NegotiateSecurityFilterEntryPoint authenticationEntryPoint;
@Autowired
private NegotiateSecurityFilter securityFilter;
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilterBefore(this.securityFilter, BasicAuthenticationFilter.class)
.httpBasic()
.authenticationEntryPoint(this.authenticationEntryPoint)
.and()
.formLogin();
}
}
更新: 大きな進歩! Windows ネットワーク資格情報を使用して認証するためのフォームを正常に取得しました。これが私がそれをした方法です:
最初に、元の投稿で省略した Bean 宣言をお見せしましょう。それらは別のクラスにあります。
// Waffle Spring Security Beans
@Bean
public WindowsAuthProviderImpl windowsAuthProvider() {
return new WindowsAuthProviderImpl();
}
@Bean
@Autowired
public NegotiateSecurityFilterProvider negotiateSecurityFilterProvider(final WindowsAuthProviderImpl windowsAuthProvider) {
return new NegotiateSecurityFilterProvider(windowsAuthProvider);
}
@Bean
@Autowired
public SecurityFilterProviderCollection waffleSecurityFilterProviderCollection(final NegotiateSecurityFilterProvider negotiateSecurityFilterProvider) {
final List<SecurityFilterProvider> securityFilterProviders = new ArrayList<SecurityFilterProvider>();
securityFilterProviders.add(negotiateSecurityFilterProvider);
return new SecurityFilterProviderCollection(securityFilterProviders.toArray(new SecurityFilterProvider[]{}));
}
@Bean
@Autowired
public NegotiateSecurityFilterEntryPoint negotiateSecurityFilterEntryPoint(final SecurityFilterProviderCollection securityFilterProviderCollection) {
final NegotiateSecurityFilterEntryPoint negotiateSecurityFilterEntryPoint = new NegotiateSecurityFilterEntryPoint();
negotiateSecurityFilterEntryPoint.setProvider(securityFilterProviderCollection);
return negotiateSecurityFilterEntryPoint;
}
@Bean
@Autowired
public NegotiateSecurityFilter waffleNegotiateSecurityFilter(final SecurityFilterProviderCollection securityFilterProviderCollection) {
final NegotiateSecurityFilter negotiateSecurityFilter = new NegotiateSecurityFilter();
negotiateSecurityFilter.setProvider(securityFilterProviderCollection);
return negotiateSecurityFilter;
}
@Bean
public WaffleAuthenticationDetailsSource waffleAuthenticationDetailsSource() {
return new WaffleAuthenticationDetailsSource();
}
さて、これは、Windowsネットワーク資格情報で認証するために生成されたスプリングセキュリティフォームを取得した方法です
まず、このタイプの Bean を追加しましたwaffle.spring.WindowsAuthenticationProvider
@Bean
@Autowired
public WindowsAuthenticationProvider windowsAuthenticationProvider(final WindowsAuthProviderImpl windowsAuthProvider) {
WindowsAuthenticationProvider provider = new WindowsAuthenticationProvider();
provider.setAuthProvider(windowsAuthProvider);
return provider;
}
次に、それを追加してSecurityConfig.java
使用し、http セキュリティ チェーンに認証プロバイダーを設定しました。
...
@Autowired
public WindowsAuthenticationProvider windowsAuthenticationProvider;
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilterBefore(this.securityFilter, BasicAuthenticationFilter.class)
.httpBasic()
.authenticationEntryPoint(this.authenticationEntryPoint)
.and()
.authenticationProvider(windowsAuthenticationProvider) // Set authentication provider here
.formLogin()
.authenticationDetailsSource(waffleAuthenticationDetailsSource);
}
ここで、ブラウザが資格情報を送信しない場合にのみフォームを使用する方法を理解する必要があります! うーん....