[JAVA] Antwortheader werden in Spring Security 4.1 möglicherweise nicht korrekt ausgegeben

Einführung

Ab dem 22. September 2017 ist die Version von Spring Security 4.2.3, daher tritt dieses Problem nicht auf: Schweiß :.

** Nachtrag 2018/9/12: ** ** In Spring Security 4.2.5, 5.0.2 wird die Reihenfolge von Filteranwendung → Header-Schreiben erneut geändert, sodass das gleiche Problem auftritt. Darüber hinaus gibt es in Problem einen Follow-up-Bericht, der in diesem Artikel behandelt wird. Es sieht aus wie der Unterschied zwischen Puffergröße und Festschreibungsgröße. ** ** **

Es scheint jedoch, dass Spring Security erschüttert, welche Spezifikation korrekt ist. Seien Sie daher beim Upgrade vorsichtig.

Bestätigungsumgebung

Spring Security
4.1.4.RELEASE (mit TERASOLUNA Server Framework für Java (5.3.0.RELEASE))
AP-Server
JBoss EAP 7.0.0

So geben Sie den Cache-Control-Header zunächst mit Spring Security aus

Beschreiben Sie bei der Ausgabe mit TERASOLUNA das Header-Element von Spring Security in spring-security.xml.

Im folgenden Beispiel werden die standardmäßig angewendeten Header deaktiviert und nur die Komponenten registriert, die nur die Header "Cache-Control" und "X-Content-Type-Options" ausgeben.

spring-security.xml


<sec:http>
	<sec:headers defaults-disabled="true">
		<sec:cache-control />
		<sec:content-type-options />
	</sec:headers>

Warum wird der Antwortheader nicht nur für 4.1 ausgegeben?

Unterschied in der Vorgehensweise beim Schreiben von Headern

Die Klasse, die den Header schreibt, ist "org.springframework.security.web.header.HeaderWriterFilter", die von der "doFilterInternal" -Methode verarbeitet wird. Die Implementierung in Spring Security 4.1.0 RC1 wurde jedoch geändert.

Verwandte Ausgabe: SEC-2728: Only write cache related headers if no other cache headers found #2953

↓ 4.0.1. DoFilterInternal Methode bei RELEASE

HeaderWriterFilter.java


@Override
protected void doFilterInternal(HttpServletRequest request,
	HttpServletResponse response, FilterChain filterChain)
	throws ServletException, IOException {

	for (HeaderWriter factory : headerWriters) {
		factory.writeHeaders(request, response);
	}
	filterChain.doFilter(request, response);
}

↓ 4.1.0 doFilterInternal Methode bei RC1

HeaderWriterFilter.java


	@Override
	protected void doFilterInternal(HttpServletRequest request,
			HttpServletResponse response, FilterChain filterChain)
					throws ServletException, IOException {

		HeaderWriterResponse headerWriterResponse = new HeaderWriterResponse(request,
				response, this.headerWriters);
		try {
			filterChain.doFilter(request, headerWriterResponse);
		}
		finally {
			headerWriterResponse.writeHeaders();
		}
	}

In 4.0.1 erfolgt die Verarbeitung in der Reihenfolge des Schreibens von Headern → Filteranwendung, in 4.1.0 jedoch in der Reihenfolge von Filteranwendung → Schreiben von Headern.

Was ist los?

Bei Verwendung von try-finally wird der Header auch dann geschrieben, wenn im Filteranwendungsprozess eine Ausnahme auftritt. Wenn der http-Stream jedoch im Filteranwendungsprozess geleert wird, wird er, selbst wenn der Header geschrieben wird, auf die Clientseite geschrieben. Wird nicht gesendet. (Ich konnte nicht genau herausfinden, was das Problem war, als ich das Problem mit dem Fehlerbericht anrief: ängstlich :) Im Folgenden sind die Zielprobleme aufgeführt. Weitere Informationen finden Sie hier.

Spring Security not writing http headers when the http stream was flushed by a participant of the filterChain. #3975

Welche Art von Antwort benötigen Sie?

Lassen Sie uns die Version von Spring Security erhöhen: smiley: Wenn Sie die Version nicht einfach aktualisieren können, ersetzen Sie den "HeaderWriterFilter". In der Fehlerberichtausgabe von ↑ lautet die Änderung von HeaderWriterFilter Zurücksetzen, also`HeaderWriterFriterF Es ist in Ordnung, wenn Sie verwenden.

So ersetzen Sie HeaderWriterFilter

Wenn Sie einen anderen "HeaderWriterFilter" als Spring Security 4.1 in "com.neriudon.sample.filter" platzieren und ihn "CustomizedHeaderWriterFilter" nennen, sieht dieser wie folgt aus.

spring-security.xml


	<bean id="secureCacheControlHeadersWriter"
		class="org.springframework.security.web.header.writers.DelegatingRequestMatcherHeaderWriter">
		<constructor-arg>
			<bean
				class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
				<constructor-arg value="/**" />
			</bean>
		</constructor-arg>
		<constructor-arg>
			<bean
				class="org.springframework.security.web.header.writers.CacheControlHeadersWriter" />
		</constructor-arg>
	</bean>

	<bean id="customizedHeaderWriterFilter" class="com.neriudon.sample.filter.CustomizedHeaderWriterFilter">
		<constructor-arg ref="secureCacheControlHeadersWriter" />
	</bean>

	<sec:http>
		<sec:headers disabled="true" />
		<sec:custom-filter position="HEADERS_FILTER"
			ref="customizedHeaderWriterFilter" />

Der Punkt ist

 <sec:headers disabled="true" />
        <sec:custom-filter position="HEADERS_FILTER"
            ref="customizedHeaderWriterFilter" />

Es ist der Teil von. Sie können position verwenden, um es durch Ihren eigenen Filter zu ersetzen, aber Sie müssen headers disabled =" true " setzen, da dies mit vorhandenen Filtern in Konflikt steht. Daher wird der Header angegeben, der an den zu ersetzenden Filter ausgegeben werden soll. Dieser Teil wird in den TERASOLUNA-Richtlinien aus Ausgabe des Sicherheitsheaders für jedes Anforderungsmuster zitiert. Hat.

Wie ich diesen Artikel gepostet habe

Als ich die Version von TERASOLUNA anhob, wurde der Header nicht mehr ausgegeben, also: frowning2: Es gibt einen Kommentar, dass das Verhalten in Tomcat / JBoss sogar in der Fehlerbericht-Ausgabe anders ist, aber ... Es ist tief: enttäuscht_relieved:

Recommended Posts

Antwortheader werden in Spring Security 4.1 möglicherweise nicht korrekt ausgegeben
Antwortheader für die Verwendung von Spring Security
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
[In 5.2.1 behoben] Spring Security 5.2.0.RELEASE weist Inkompatibilitäten auf, die im Versionshinweis nicht erwähnt sind
JSESSIONID konnte bei Verwendung von Spring Security nicht der URL zugewiesen werden
Spring Boot-Protokoll im JSON-Format ausgeben
Antwortdaten direkt im Frühjahr schreiben
Ausgabe Bean als JSON im Frühjahr