我在尝试让<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/myapp
和https://server/myapp
。在这两种情况下,Spring Security都能拦截此URL并向我显示登录页面。
现在,我想要做的是将所有http网址重定向到https网址。所以,我将requires-channel="https"
添加到<security:intercept-url />
<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
时,网址在浏览器栏中没有变化,但我仍然得到了#34;重定向循环&#34;问题。即使我尝试点击https://server/myapp
,我仍然会遇到同样的问题。
我已经没有关于如何调试此问题的想法。看起来当我添加requires-channel="https"
时,它会在WAS上中断,但它在Jetty上运行得很好。我目前的解决方法是删除requires-channel="https"
,以便https可以在WAS上运行,但用户可以使用http访问该网站。
只是为了抛弃另一件事,为http添加端口9080和为https添加端口9443并不能解决WAS上的问题。
有什么想法吗?谢谢你的帮助。
答案 0 :(得分:0)
我目前的解决方法是删除requires-channel =&#34; https&#34;以便 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以及任何其他容器一起使用。