【问题标题】:Spring Security: requires-channel="https" causes redirect loopSpring Security: requires-channel="https" 导致重定向循环
【发布时间】:2014-07-24 04:47:25
【问题描述】:

我在尝试让<security:intercept-url ... requires-channel="https"/> 在 WAS 上正常工作时遇到问题。应用程序服务器已启用 SSL。

当我有这样的配置时:-

<security:http auto-config="true">
    <security:form-login .../>
    <security:logout .../>

    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
</security:http>

...我可以同时点击http://server/myapphttps://server/myapp。在这两种情况下,Spring Security 都能够拦截此 URL 并向我显示登录页面。

现在,我要做的是将所有 http URL 重定向到 https URL。所以,我将requires-channel="https" 添加到&lt;security:intercept-url /&gt;

<security:http auto-config="true">
    <security:form-login .../>
    <security:logout .../>

    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" requires-channel="https" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" requires-channel="https" />
</security:http>

...现在,当我尝试点击 http://server/myapp 时,我看到 http://server/myapp/myapp/myapp/myapp/myapp/myapp 并进入重定向循环。

所以,我重新定义了端口映射:-

<security:http auto-config="true">
    <security:form-login .../>
    <security:logout .../>

    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" requires-channel="https" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" requires-channel="https" />

    <security:port-mappings>
        <security:port-mapping http="80" https="443"/>
    </security:port-mappings>
</security:http>

...当我尝试点击 http://server/myapp 时,浏览器栏中的 URL 没有改变,但我仍然遇到“重定向循环”问题。即使我尝试点击https://server/myapp,我仍然会遇到同样的问题。

关于如何调试此问题的想法已经不多了。似乎当我添加 requires-channel="https" 时,它在 WAS 上中断,但在 Jetty 上运行良好。我目前的解决方法是删除 requires-channel="https" 以便 https 在 WAS 上工作,但随后用户可能会使用 http 访问该站点。

只是为了抛出另一件事,为 http 添加端口 9080 和为 https 添加端口 9443 并不能解决 WAS 上的问题。

有什么想法吗?感谢您的帮助。

【问题讨论】:

  • 免责声明:我可能是错的,这毕竟是互联网 :) 我似乎记得你需要 &lt;mvc:default-servlet-handler /&gt; 或调用 DefaultServletHandlerConfigurer.enable() 如果你正在使用注释配置以使其正常工作,因此您可能需要检查是否还没有添加它。
  • 您找到解决方案了吗?我遇到了同样的问题
  • 我也遇到了同样的问题...有什么解决办法吗?
  • 您是否尝试查看循环发生在 Spring 框架的哪个位置?您也许可以引入一个打破循环的过滤器

标签: java spring ssl spring-security websphere


【解决方案1】:

我目前的解决方法是删除 requires-channel="https" 以便 https 在 WAS 上工作,但随后,用户可能会使用 http 访问该站点。

我没有解决此问题的方法,但这里有一个解决方法:

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;     
import org.springframework.web.filter.OncePerRequestFilter; 

@Component
public class UnsecureRequestFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
                    throws ServletException, IOException { 
        if (!request.isSecure()) {
            response.sendRedirect("https://domain.example.com/");
        } else { 
            filterChain.doFilter(request, response); 
        } 
    }
} 

这是独立于平台的,因此应该与 WAS 以及任何其他容器一起使用。

【讨论】:

    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2011-09-18
    • 1970-01-01
    • 2016-06-15
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多