跨多个http部分共享Spring Security Context

时间:2018-05-13 22:46:14

标签: spring spring-security

我遇到了在主端点(/ **)上提供基本应用程序的情况。我在使用任何其他资源之前使用spring security来验证用户身份。身份验证是通过登录表单完成的。

但特别是端点(/ lti / **)正在另一个Http部分中使用。在那里,Spring安全性使用OAuth处理身份验证。

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

现在问题在于,即使用户使用OAuth来验证从/ 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>

任何可行的方法或有任何想法我如何解决这种情况?

1 个答案:

答案 0 :(得分:0)

每个请求都会填充SecurityContext,FilterChain使用 SecurityContextPersistenceFilter 在请求开始时对其进行设置。通过deafult,此过滤器将身份验证数据存储在HttpSession中。

用户在页面中进行身份验证,然后加载启动不同HttpSession的Iframe(如果您观看会话ID,则可以检查此内容)。

然后你有几个选择:

  1. 请勿使用iframe。如果不是必须的话,最好的选择。
  2. 配置默认的RememberMe过滤器。问题是每个会话都会记住用户,直到cookie过期。
  3. 以比会话更持久的方式存储SecurityContext。
  4. 总结一下,我认为你的问题不是关于不同的切入点,而是关于不同的会话。