我正在尝试在不利用cookie的情况下管理Spring Security中的会话.原因是 – 我们的应用程序显示在来自另一个域的iframe中,我们需要在我们的应用程序中管理会话,and Safari restricts cross-domain cookie creation.(上下文:domainA.com在iframe中显示domainB.com.domainB.com正在设置JSESSIONID cookie以利用在domainB.com上,但由于用户的浏览器显示domainA.com – Safari限制domainB.com创建cookie).
我能想到的唯一方法(针对OWASP安全建议) – 将URL中的JSESSIONID作为GET参数包含在内.我不想这样做,但我想不出另一种选择.
所以这个问题都是关于:
>有没有更好的替代方案来解决这个问题?
>如果不是 – 我怎样才能通过Spring Security实现这一目标
回顾Spring的文档,使用enableSessionUrlRewriting应该允许这样做
所以我做到了这一点:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
.enableSessionUrlRewriting(true)
这没有将JSESSIONID添加到URL,但现在应该允许它.然后我利用in this question找到的一些代码将“跟踪模式”设置为URL
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext
.setSessionTrackingModes(
Collections.singleton(SessionTrackingMode.URL)
);
即使在此之后 – 应用程序仍然将JSESSIONID添加为cookie而不是URL.
有人可以帮助我指出正确的方向吗?
解决方法:
您是否看过使用HTTP标头而不是cookie的Spring Session: HttpSession & RestfulAPI.请参阅REST Sample中的REST示例项目.