跨多个http节共享Spring安全上下文

跨多个http节共享Spring安全上下文,spring,spring-security,Spring,Spring Security,我的情况是,基本应用程序在主端点(/**)上提供服务。在提供任何进一步的资源之前,我使用spring安全性对用户进行身份验证。身份验证是通过登录表单完成的 但具体来说,端点(/lti/**)正在另一个Http部分中使用。在这里,Spring security使用OAuth处理身份验证 在/lti/**端点上进行身份验证后,用户需要在iFrame中加载我的整个应用程序。这意味着可以访问受第一个Http节保护的所有资源 现在的问题是,即使用户使用OAuth creds从/lti/**加载应用程序进行

我的情况是,基本应用程序在主端点(/**)上提供服务。在提供任何进一步的资源之前,我使用spring安全性对用户进行身份验证。身份验证是通过登录表单完成的

但具体来说,端点(/lti/**)正在另一个Http部分中使用。在这里,Spring security使用OAuth处理身份验证

在/lti/**端点上进行身份验证后,用户需要在iFrame中加载我的整个应用程序。这意味着可以访问受第一个Http节保护的所有资源

现在的问题是,即使用户使用OAuth creds从/lti/**加载应用程序进行身份验证,并且我设置了所有适当的用户角色,但当应用程序加载到iFrame并尝试访问任何资源时,它会按照第一个Http部分的指示重定向到登录屏幕(如果有帮助的话,后续调用是通过AJAX进行的,但是您可以在开发工具中看到响应)

根据我到目前为止的研究,不同的入口点之间不共享安全上下文。不同的防火墙被实例化,因此安全上下文本身被重新启动

以下是我的一点安全上下文:

<security:http pattern="/lti/**" use-expressions="true" entry-point-ref="oAuthProcessingFilterEntryPoint">
    <security:headers>
        <security:frame-options disabled="true"/>
    </security:headers>
    <security:intercept-url pattern="/**" access="hasRole('ROLE_OAUTH')"/>

    <!-- Filter -->
    <security:custom-filter ref="oAuthProcessingFilter" before="ANONYMOUS_FILTER"/>
    <!-- Disable CSRF -->
    <security:csrf disabled="true"/>
</security:http>

<security:http>
    <security:intercept-url ... />
     ....
    <security:form-login
            authentication-success-handler-ref="authenticationSuccessHandler"
            login-page=............"/>
    <security:logout ................./>
    <security:session-management invalid-session-url="............." session-authentication-error-url="................">
    </security:session-management>
    <!-- Enable csrf protection -->
    <security:csrf/>
</security:http>

....

SecurityContext填充在每个请求中,FilterChain使用SecurityContextPersistenceFilter在请求开始时设置它。通过deafult,此筛选器将身份验证数据存储在HttpSession中

用户在一个页面中经过身份验证,然后加载一个Iframe,该Iframe启动一个不同的HttpSession(如果您观看sessionid,可以对此进行检查)

然后您有几个选项:

  • 不要使用Iframe。如果不是必须的话,这是最好的选择
  • 配置默认的RememberMe筛选器。问题是在每次会话中都会记住用户,直到cookie过期
  • 以比会话更持久的方式存储SecurityContext

  • 总而言之,我认为您的问题不在于不同的入口点,而在于不同的会话。

    谢谢。我将尝试这种方法。我必须使用OAuth 1.0,但这种方法可能会奏效。我认为您误解了问题,我也误解了您的答案。问题不在于让用户在每次请求时再次登录。如果您重新阅读了这个问题,只有当上下文从/lti/**更改为/iFrame/**时才是问题。会话不共享,因此是上下文。