Spring security 使用<;过滤链>;标签

Spring security 使用<;过滤链>;标签,spring-security,Spring Security,我正在GWT应用程序中使用SpringSecurity3.2.5。我需要对安全性进行细粒度控制,因此我使用以下配置而不是元素: <beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <beans:constructor-arg> <beans:list>

我正在GWT应用程序中使用SpringSecurity3.2.5。我需要对安全性进行细粒度控制,因此我使用以下配置而不是元素:

<beans:bean id="springSecurityFilterChain"
        class="org.springframework.security.web.FilterChainProxy">
        <beans:constructor-arg>
            <beans:list>
                <filter-chain pattern="/css/**" filters="none" />
                <filter-chain pattern="/image/**" filters="none" />
                <filter-chain pattern="/index.jsp" filters="none" />
                <filter-chain pattern="/**/logout" filters="logoutFilter" />
                <filter-chain pattern="/**"
                    filters="securityContextPersistenceFilterWithASCTrue, concurrentSessionFilter, usernamePasswordAuthenticationFilter, exceptionTranslationFilter, filterSecurityInterceptor" />
           </beans:list>
        </beans:constructor-arg>
</beans:bean>

我省略了特定的过滤器实现

我需要强制上面的大多数过滤器链在使用标记时使用https,如以下示例所示:

<security:intercept-url pattern="/reports" access="ROLE_ADMIN" requires-channel="https"/>

我怎样才能做到这一点

编辑1:添加ChannelProcessingFilter

在@luke answer之后,我修改了代码,使通道过滤器位于过滤器链的第一个位置:

<filter-chain pattern="/**"
    filters="channelProcessingFilter, securityContextPersistenceFilterWithASCTrue, ..." />

我还添加了以下bean配置:

<!-- Ensure https channel -->
    <beans:bean id="filterSecurityInterceptor"
        class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
        <beans:property name="authenticationManager" ref="authenticationManager" />
        <beans:property name="accessDecisionManager" ref="accessDecisionManager" />
        <beans:property name="securityMetadataSource">
            <filter-security-metadata-source>
                <intercept-url pattern="/**" access="ROLE_USER" />
            </filter-security-metadata-source>
        </beans:property>
    </beans:bean>

    <beans:bean id="channelProcessingFilter" class="org.springframework.security.web.access.channel.ChannelProcessingFilter">
        <beans:property name="channelDecisionManager" ref="channelDecisionManager"/>
        <beans:property name="securityMetadataSource">
            <filter-security-metadata-source request-matcher="ant">
                <intercept-url pattern="/**" access="REQUIRES_SECURE_CHANNEL"/>
            </filter-security-metadata-source>
        </beans:property>
    </beans:bean>

    <beans:bean id="channelDecisionManager" class="org.springframework.security.web.access.channel.ChannelDecisionManagerImpl">
        <beans:property name="channelProcessors">
            <beans:list>
                <beans:ref bean="secureChannelProcessor"/>
                <beans:ref bean="insecureChannelProcessor"/>
            </beans:list>
        </beans:property>
    </beans:bean>

    <beans:bean id="secureChannelProcessor" class="org.springframework.security.web.access.channel.SecureChannelProcessor" />
    <beans:bean id="insecureChannelProcessor" class="org.springframework.security.web.access.channel.InsecureChannelProcessor" />

现在的问题是,在通过http提交登录表单之后,我得到了一个无限循环。当然这是我想要避免的情况,但是无限循环是不对的。这是相关日志:

调试o.s.s.w.过滤器ChainProxy 337-/j\u弹簧\u安全检查 附加过滤器链中的位置1/6;点火过滤器: “ChannelProcessingFilter”

调试o.s.s.w.a.c.通道处理过滤器134 -请求:过滤器职业:URL:/j\u spring\u security\u check;ConfigAttributes:[需要安全通道]2014-10-30 19:47:10565

调试o.s.s.w.a.c.RetryWithHttpsEntryPoint 55-重定向到: /弹簧安全检查2014-10-30 19:47:10567调试 o、 s.s.w.DefaultRedirectStrategy 36-重定向到 “/j_spring_security_check”

有什么好主意吗?

你需要一个好主意


最好只需要HTTPS即可访问所有站点。只有从一开始就使用HTTPS,它才是真正安全的。理想情况下,您也希望使用它与客户沟通。

Hi@luke。我在HttpSentryPoint 55中得到一个无限循环-重定向到:/j\u spring\u security\u check。请看我上面的编辑,你的HTTPS设置正确吗?i、 e.你能通过HTTPS访问应用程序并在没有额外过滤器的情况下登录吗?是的,我删除了channelProcessingFilter,我可以使用HTTPS登录。我还测试了将channelProcessingFilter放回原处,可以通过普通http进行访问。这一切正常吗?顺便说一句,服务器是用GWT Eclipse插件安装的Jetty