5 changed files with 434 additions and 20 deletions
@ -0,0 +1,162 @@
@@ -0,0 +1,162 @@
|
||||
/* |
||||
* Copyright 2002-2013 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.security.config.annotation.web.configurers |
||||
|
||||
import javax.servlet.http.HttpServletResponse |
||||
|
||||
import org.springframework.context.annotation.Configuration |
||||
import org.springframework.security.config.annotation.BaseSpringSpec |
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder |
||||
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.access.AccessDeniedHandler |
||||
import org.springframework.security.web.csrf.CsrfFilter; |
||||
import org.springframework.security.web.csrf.CsrfTokenRepository; |
||||
import org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor; |
||||
import org.springframework.security.web.util.RequestMatcher; |
||||
import org.springframework.web.servlet.support.RequestDataValueProcessor; |
||||
|
||||
import spock.lang.Unroll; |
||||
|
||||
/** |
||||
* |
||||
* @author Rob Winch |
||||
*/ |
||||
class HeadersConfigurerTests extends BaseSpringSpec { |
||||
|
||||
def "headers"() { |
||||
setup: |
||||
loadConfig(HeadersConfig) |
||||
request.secure = true |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['X-Content-Type-Options':'nosniff', |
||||
'X-Frame-Options':'DENY', |
||||
'Strict-Transport-Security': 'max-age=31536000 ; includeSubDomains', |
||||
'Cache-Control': 'no-cache,no-store,max-age=0,must-revalidate', |
||||
'Pragma':'no-cache', |
||||
'X-XSS-Protection' : '1; mode=block'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class HeadersConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers() |
||||
} |
||||
} |
||||
|
||||
def "headers.contentType"() { |
||||
setup: |
||||
loadConfig(ContentTypeOptionsConfig) |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['X-Content-Type-Options':'nosniff'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class ContentTypeOptionsConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers().contentTypeOptions() |
||||
} |
||||
} |
||||
|
||||
def "headers.frameOptions"() { |
||||
setup: |
||||
loadConfig(FrameOptionsConfig) |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['X-Frame-Options':'DENY'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class FrameOptionsConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers().frameOptions() |
||||
} |
||||
} |
||||
|
||||
def "headers.hsts"() { |
||||
setup: |
||||
loadConfig(HstsConfig) |
||||
request.secure = true |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['Strict-Transport-Security': 'max-age=31536000 ; includeSubDomains'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class HstsConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers().httpStrictTransportSecurity() |
||||
} |
||||
} |
||||
|
||||
def "headers.cacheControl"() { |
||||
setup: |
||||
loadConfig(CacheControlConfig) |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['Cache-Control': 'no-cache,no-store,max-age=0,must-revalidate', |
||||
'Pragma':'no-cache'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class CacheControlConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers().cacheControl() |
||||
} |
||||
} |
||||
|
||||
def "headers.xssProtection"() { |
||||
setup: |
||||
loadConfig(XssProtectionConfig) |
||||
when: |
||||
springSecurityFilterChain.doFilter(request,response,chain) |
||||
then: |
||||
responseHeaders == ['X-XSS-Protection' : '1; mode=block'] |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableWebSecurity |
||||
static class XssProtectionConfig extends WebSecurityConfigurerAdapter { |
||||
|
||||
@Override |
||||
protected void configure(HttpSecurity http) throws Exception { |
||||
http.headers().xssProtection() |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue