Spring Security 3.2+ defaults break Wicket Ajax-based file uploads
A couple of days ago we have run into a bug: we found that file uploads in our Wicket application have broken. Instead of working as expected, upload button did not work, instead a message appeared in the browser console (this one is for Chrome):
Refused to display 'http://localhost:8084/paynet-ui/L7ExSNbPC4sb6TPJDblCAkN0baRJxw3q6-_dANoYsTD…QK61FV9bCONpyleIKW61suSWRondDQjTs8tjqJJOpCEaXXCL_A%2FL7E59%2FTs858%2F9QS3a' in a frame because it set 'X-Frame-Options' to 'DENY'.
`
That seemed strange, because X-Frame-Options
relates to frames which we didn’t use explicitly. But when a
*file upload** is made using Ajax, Wicket carries this out using an implicit Frame.
Spring Security started adding this header
starting with version 3.2, so it was actually an upgrade to Spring Security 3.2 that broke file uploads.
To sort this out, it was sufficiently to change the X-Frame-Options
value from DENY
to SAMEORIGIN
using
the following snippet in web security configuration (created using
@Configuration-based approach):
http
.headers()
.contentTypeOptions()
.xssProtection()
.cacheControl()
.httpStrictTransportSecurity()
.addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
File uploads work now, the quest is finished.