Migration einer Waffle Spring Security XML-Konfiguration nach Spring Boot

Ich versuche, die Waffelauthentifizierung mit Spring Security auf Spring Boot-Art zu verwenden. Das erwartete Ergebnis ist "Alles blockieren, wenn die Verhandlung fehlschlägt".

Waffle-Projekt bietet einKonfigurationsbeispiel für diese Art von Anwendungsfall (in diesem Beispiel gibt es einen Fallback zur einfachen HTTP-Authentifizierung, wenn die Verhandlung fehlschlägt, was ich nicht benötige), vorausgesetzt, die Konfiguration erfolgt überweb.xml. Trotz vieler Versuche verstehe ich nicht, wie man Waffle mit Spring Security mithilfe der Boot- und Java-Konfiguration verbindet. Ich verwende Spring Boot 1.2.1.RELEASE mit Starter-Web und Sicherheit, Waffel-Version ist 1.7.3.

Mir ist klar, dass dies keine spezielle Frage ist, aber das Frühlingsforum leitet jetzt hier um und die Waffeltypen wissen nichts über Spring Boot. Kann mir jemand helfen, eine XML Spring Security-Konfiguration in Spring Boot zu übersetzen?

Der erste Schritt deklariert eine Filterkette und einen Context Loader Listener.

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/waffle-filter.xml</param-value> 
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Ich gehe davon aus (irre ich mich?), Dass dies bereits von @ gehandhabt wir@EnableWebMvcSecurity, also hier nichts zu tun.

Next deklariert ein paar Provider-Beans, also übersetze ich dieses

<bean id="waffleWindowsAuthProvider" class="waffle.windows.auth.impl.WindowsAuthProviderImpl" />

<bean id="negotiateSecurityFilterProvider" class="waffle.servlet.spi.NegotiateSecurityFilterProvider">
    <constructor-arg ref="waffleWindowsAuthProvider" />
</bean>

<bean id="basicSecurityFilterProvider" class="waffle.servlet.spi.BasicSecurityFilterProvider">
    <constructor-arg ref="waffleWindowsAuthProvider" />
</bean>

<bean id="waffleSecurityFilterProviderCollection" class="waffle.servlet.spi.SecurityFilterProviderCollection">
    <constructor-arg>
        <list>
            <ref bean="negotiateSecurityFilterProvider" />               
            <ref bean="basicSecurityFilterProvider" />               
        </list>
    </constructor-arg>
</bean>

<bean id="waffleNegotiateSecurityFilter" class="waffle.spring.NegotiateSecurityFilter">
    <property name="Provider" ref="waffleSecurityFilterProviderCollection" />
</bean>

zu diesem

@Bean
public WindowsAuthProviderImpl waffleWindowsAuthProvider() {
    return new WindowsAuthProviderImpl();
}

@Bean
@Autowired
public NegotiateSecurityFilterProvider negotiateSecurityFilterProvider(final WindowsAuthProviderImpl windowsAuthProvider) {
    return new NegotiateSecurityFilterProvider(windowsAuthProvider);
}

@Bean
@Autowired
public BasicSecurityFilterProvider basicSecurityFilterProvider(final WindowsAuthProviderImpl windowsAuthProvider) {
    return new BasicSecurityFilterProvider(windowsAuthProvider);
}

@Bean
@Autowired
public SecurityFilterProviderCollection waffleSecurityFilterProviderCollection(final NegotiateSecurityFilterProvider negotiateSecurityFilterProvider, final BasicSecurityFilterProvider basicSecurityFilterProvider) {
    final SecurityFilterProvider[] securityFilterProviders = {
            negotiateSecurityFilterProvider,
            basicSecurityFilterProvider
    };
    return new SecurityFilterProviderCollection(securityFilterProviders);
}

@Bean
@Autowired
public NegotiateSecurityFilter waffleNegotiateSecurityFilter(final SecurityFilterProviderCollection securityFilterProviderCollection) {
    final NegotiateSecurityFilter negotiateSecurityFilter = new NegotiateSecurityFilter();
    negotiateSecurityFilter.setProvider(securityFilterProviderCollection);
    return negotiateSecurityFilter;
}

Letzter Schritt istsec:http section Konfiguration. Ein Einstiegspunkt wird deklariert und der Filter wird vor dem BASIC-Authentifizierungsfilter platziert.

Beispiel

<sec:http entry-point-ref="negotiateSecurityFilterEntryPoint">
    <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
    <sec:custom-filter ref="waffleNegotiateSecurityFilter" position="BASIC_AUTH_FILTER" />
</sec:http>

<bean id="negotiateSecurityFilterEntryPoint" class="waffle.spring.NegotiateSecurityFilterEntryPoint">
    <property name="Provider" ref="waffleSecurityFilterProviderCollection" />
</bean>

Meine Boot-Übersetzung:

@Autowired
private NegotiateSecurityFilterEntryPoint authenticationEntryPoint;

@Autowired
private NegotiateSecurityFilter negotiateSecurityFilter;    

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .addFilterBefore(this.negotiateSecurityFilter, BasicAuthenticationFilter.class)
            .httpBasic().authenticationEntryPoint(this.authenticationEntryPoint);
}

@Bean
@Autowired
public NegotiateSecurityFilterEntryPoint negotiateSecurityFilterEntryPoint(final SecurityFilterProviderCollection securityFilterProviderCollection) {
    final NegotiateSecurityFilterEntryPoint negotiateSecurityFilterEntryPoint = new NegotiateSecurityFilterEntryPoint();
    negotiateSecurityFilterEntryPoint.setProvider(securityFilterProviderCollection);
    return negotiateSecurityFilterEntryPoint;
}

Das Ausführen dieser Konfiguration führt zu seltsamem Verhalten: Manchmal wird NTLM ausgelöst und ist erfolgreich, manchmal stürzt der Negotiate-Filter mit dem Fehler "Ungültiges Token angegeben" ab (gleiche Anmeldeinformationen, Benutzer, Browser, Konfiguration).

Bereitgestelltes Beispiel funktioniert wie ein Zauber, der mich glauben lässt, dass meine Boot-Konfiguration in Frage steht.

Jede Hilfe dankbar!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage