如何在spring security中为内容安全策略启用选择性http模式

时间:2015-12-17 21:46:35

标签: java spring spring-security content-security-policy spring-security-ldap

我的spring安全配置如下:

<http pattern="/*/yyy/**" security="none" />
<http pattern="/*/zzz/**" security="none"/>


<http create-session="stateless" use-expressions="true">
    <csrf disabled="true" />
    <intercept-url method="GET" pattern="/*/api/products" access="xxxx" />
    <http-basic entry-point-ref="customBasicAuthenticationEntryPoint" />
</http>

现在,对于上面带有security =“none”的http模式,我想为此启用内容安全策略(CSP)。只要我保持安全=“无”,我认为我不能将CSP应用于它。

在Spring安全性中启用CSP的标题如下:

<headers>
    <header name="Content-Security-Policy" value="default-src 'self'"/>
</headers>

现在,我想将此标头仅应用于前两个http模式,其中我现在有安全性=“无”,而不是我在下一个http块中添加的其余URL。我找不到办法做到这一点。可能吗?有人可以建议吗?

我不需要为前两个模式定义入口点参考。但是,删除security =“none”有点迫使我为它定义一个。请注意,我想要的是能够为所选模式启用CSP,这就是全部。请帮忙!

更新                                
                      

1 个答案:

答案 0 :(得分:2)

使用security="none"表示安全性未应用于网址,因此将带有Spring Security的内容安全策略添加到与security="none"映射的网址的说法是矛盾的。

我猜你想允许任何用户访问这些网址。如果是这种情况,您可以轻松使用permitAll表达式。

然后,您可以使用DelegatingRequestMatcherHeaderWriter指定哪些网址具有内容安全策略集。例如,使用Spring Security 4+,您可以使用:

<http>
    <intercept-url pattern="/*/yyy/**" access="permitAll" />
    <intercept-url pattern="/*/zzz/**" access="permitAll"/>
    <intercept-url method="GET" pattern="/*/api/products" access="xxxx" />


    <headers>
        <header ref="headerWriter"/>
    </headers>

    <csrf disabled="true" />
    <http-basic entry-point-ref="customBasicAuthenticationEntryPoint" />
    <!-- ... -->
</http>

<beans:bean id="headerWriter"
    class="org.springframework.security.web.header.writers.DelegatingRequestMatcherHeaderWriter">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.security.web.util.matcher.OrRequestMatcher">
             <beans:constructor-arg>

                <beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher"
            c:pattern="/*/yyy/**"/>
                <beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher"
            c:pattern="/*/zzz/**"/>
            </beans:constructor-arg>
        </beans:bean>
    </beans:constructor-arg>
    <beans:constructor-arg>
        <beans:bean
            class="org.springframework.security.web.header.writers.StaticHeadersWriter"
            c:headerName="Content-Security-Policy"
            c:headerValues="default-src 'self'"  
        />
    </beans:constructor-arg>
</beans:bean>

请注意,如果您使用的是Spring Security 3,那么您需要明确列出要启用的所有标头(添加任何显式标头意味着只应用这些标头)。例如:

    <headers>
        <cache-control />
        <content-type-options />
        <hsts />
        <frame-options />
        <xss-protection />

        <header ref="headerWriter"/>
    </headers>

您可以在the migration guide找到有关差异的其他详细信息。