我正在尝试在不使用cookie的情况下管理Spring Security中的会话。原因是-我们的应用程序显示在另一个域的iframe中,我们需要管理应用程序中的会话,and Safari restricts cross-domain cookie creation。(上下文:domainA.comdomainB.com在iframe中显示www.example.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中。
有人能帮我指个方向吗?
4条答案
按热度按时间ffdz8vbo1#
你看过《Spring》吗?HttpSession & RestfulAPI,使用HTTP头而不是cookie。请参阅REST示例中的REST示例项目。
vddsk6oq2#
基于表单的登录主要是有状态会话。在您的场景中,最好使用无状态会话。
JWT为此提供了实现。它基本上是一个键,你需要在每个HTTP请求中作为头传递。只要你有钥匙。API可用。
我们可以将JWT与Spring集成。
基本上你需要写这些逻辑。
我可以给予你个好机会
pom.xml
TokenHelper.java
网络安全
TokenAuthenticationFilter.java
wa7juj8i3#
您可以在网站DomainB.com服务器和客户端浏览器之间进行基于令牌的通信。令牌可以在身份验证后从DomainB.com服务器在响应的标头中发送。然后客户端浏览器可以将令牌保存在本地存储/会话存储中(也有到期时间)。然后客户端可以在每个请求的报头中发送令牌。希望这对你有帮助。
jmo0nnb34#
我很感激上面的所有答案-我最终选择了一个更简单的解决方案,而没有做任何应用程序级别的更改,因为www.example.com的所有者domainA.com愿意与我们合作。在这里贴给别人,因为我甚至没有想到这一点最初.
基本上:
再次感谢您的回答,抱歉没有在这里选择答案-忙碌周。