【问题标题】:Share Spring Security Context across multiple http sections跨多个 http 部分共享 Spring Security Context
【发布时间】:2018-05-16 00:54:33
【问题描述】:

我有一种情况,我在主端点 (/**) 上提供基本应用程序。在提供任何其他资源之前,我使用 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>

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

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    SecurityContext 填充在每个请求中,FilterChain 在请求开始时使用 SecurityContextPersistenceFilter 设置它。默认情况下,此过滤器将身份验证数据存储在 HttpSession 中。

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

    那么你有几个选择:

    1. 不要使用 iframe。最好的选择,如果不是必须的话。
    2. 配置默认的 RememberMe 过滤器。问题是用户将在每个会话中被记住,直到 cookie 过期。
    3. 以比会话更持久的方式存储 SecurityContext。

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

    【讨论】:

    • 谢谢。我会尝试这种方法。我必须使用 OAuth 1.0,但这种方法可能有效。
    • 我认为你误解了这个问题,我也误解了你的答案。问题不在于让用户在每次请求时再次登录。如果你重新阅读问题,只有当上下文从 iFrame 从 /lti/** 变为 /** 时才会出现问题。会话不共享因此上下文。
    猜你喜欢
    • 2014-01-18
    • 2013-09-19
    • 2012-01-03
    • 2015-04-13
    • 2019-10-26
    • 1970-01-01
    • 2015-10-14
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多