Использование настраиваемой формы для аутентификации Spring Security Waffle вместо всплывающего окна браузера

Я создаю Spring MVC приложение, которое аутентифицируется с помощью Waffle. Я успешно настроил его, и он работает просто отлично, но я хотел бы использовать настраиваемую форму вместо всплывающего окна браузера, когда браузер не отправляет свои сетевые учетные данные автоматически.

Я изменил свою конфигурацию, чтобы использовать 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. Вот как я это сделал:

Прежде всего, позвольте мне показать вам объявления о бобах, которые я оставил в своем первоначальном посте. Они расположены в отдельном классе.

// 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

Во-первых, я добавил этот боб типа 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);

}

Теперь мне нужно только выяснить, как использовать форму, только если браузер не отправляет учетные данные! Хммм....

0 ответов

Другие вопросы по тегам