在同一战争中防止spring会话重写

在同一战争中防止spring会话重写,spring,session,spring-security,token,spring-security-oauth2,Spring,Session,Spring Security,Token,Spring Security Oauth2,假设我有一个WAR,它在JSP中有一个前端,包括一个带有RESTAPI的JAR 我有一个spring security.xml,其中配置了多个AuthenticationProvider 我面临的问题如下: 用户(user1)通过基本身份验证(localhost/app1)登录到JSP前端 在同一浏览器上,不同的用户(user2)使用oauth令牌(localhost/app2)登录到不同的前端 每当此令牌用于REST调用(localhost/REST)时,来自JSP前端(app1)的用户(u

假设我有一个WAR,它在JSP中有一个前端,包括一个带有RESTAPI的JAR

我有一个
spring security.xml
,其中配置了多个AuthenticationProvider

我面临的问题如下:

  • 用户(user1)通过基本身份验证(localhost/app1)登录到JSP前端
  • 在同一浏览器上,不同的用户(user2)使用oauth令牌(localhost/app2)登录到不同的前端
  • 每当此令牌用于REST调用(localhost/REST)时,来自JSP前端(app1)的用户(user1)都会被user2覆盖
对于RESTAPI,启用了
create session=“never”
。但是JSP会话中的用户无论如何都会被覆盖

我正在使用Spring3.2.15和SpringSecurity 3.2.9

spring security.xml的相关部分:

<!-- The configuration for the rest-api -->
<security:http pattern="/rest/**" create-session="never" use-expressions="true"
               entry-point-ref="authenticationEntryPoint">
    <security:anonymous enabled="false" />
    <security:intercept-url pattern="/rest/**" access="permitAll" method="OPTIONS" />
    <security:intercept-url pattern="/rest/**" access="isAuthenticated()" />
    <security:custom-filter ref="CORSFilter" position="FIRST" />
    <security:custom-filter ref="um-rest-resource-server" before="PRE_AUTH_FILTER" />
</security:http>

<!-- Other configration for the other endpoints (not under /rest/) ... -->

<oauth2:resource-server id="um-rest-resource-server" resource-id="um-rest-resource-server" token-services-ref="tokenVerifier" />

<bean id="tokenVerifier" class="be.healthconnect.iam.oauth2.verifier.TokenVerifier"></bean>

如果所有的前线都在同一场战争中,这就是我们想要发生的事情

但是有一种方法你可以给我一个机会。如果您的REST app2实际上是完全无状态的,请尝试通过以下方式将创建会话策略设置为无状态:
create session=“stateless”


将会话创建策略设置为无状态时,
SecurityContextHolder
甚至不会被检查以查找有效会话,也不会调用它来保存成功的身份验证

浏览器必须将所有请求的会话cookie发送到服务器。您的第二个调用(到
localhost/app2
)包含会话cookie,Spring Security使用此会话(并更改您的用户)

有一些解决方案,但如果您根本不需要会话,您可以通过设置
create session=“stateless”
,告诉Spring Security忽略请求中的会话cookie,请参阅:

  • 创建会话控制Spring安全类创建HTTP会话的迫切性。选择包括:

    • 始终
      -如果会话不存在,Spring Security将主动创建会话
    • ifRequired
      -只有在需要会话时,Spring Security才会创建会话(默认值)
    • 从不
      -Spring Security永远不会创建会话,但如果应用程序创建会话,它将使用会话
    • 无状态
      -Spring Security不会创建会话并忽略用于获取Spring
      身份验证的会话
如果您需要会话,其他解决方案包括:

  • 分离浏览器会话
  • 分离战争文件
  • 会话ID的URL重写
  • 不允许再次登录