Общий доступ к контексту безопасности Spring в нескольких разделах http - PullRequest
0 голосов
/ 14 мая 2018

У меня есть ситуация, когда основное приложение обслуживается на главной конечной точке (/ **).Я использую Spring Security для аутентификации пользователя перед обслуживанием любых других ресурсов.Аутентификация выполняется с помощью формы для входа.

Но, в частности, конечная точка (/ lti / **) используется в другом разделе Http.Там Spring Security обрабатывает аутентификацию, используя OAuth.

После аутентификации на конечной точке / lti / ** пользователь должен загрузить все мое приложение в iFrame.Это означает доступ ко всем ресурсам, защищенным 1-м Http-разделом.

Теперь проблема в том, что даже если пользователь прошел аутентификацию с помощью кредитов OAuth для загрузки приложения из / lti / **, и я установил всех соответствующих пользователейролей, когда приложение загружается в iFrame и пытается получить доступ к любым ресурсам, оно перенаправляется на экран входа в систему, как указано в первом разделе Http (последующие вызовы через AJAX, если это помогает, но вы можете увидеть ответ в devинструменты).

Основываясь на моих исследованиях, контекст безопасности не распределяется между разными точками входа.Различные брандмауэры создаются, поэтому сам контекст безопасности повторно инициируется.

Вот немного моего контекста безопасности:

<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 голосов
/ 14 мая 2018

SecurityContext заполняется в каждом запросе, FilterChain устанавливает его в начале запроса с помощью SecurityContextPersistenceFilter . По умолчанию этот фильтр хранит данные аутентификации в HttpSession.

Пользователи аутентифицируются на странице, а затем вы загружаете Iframe, который запускает другой сеанс HttpSession (вы можете проверить это, если посмотрите сессионные идентификаторы).

Тогда у вас есть несколько вариантов:

  1. Не используйте Iframe. Лучший вариант, если это не обязательно.
  2. Настройка фильтра RememberMe по умолчанию. проблема заключается в том, что пользователи будут запоминаться в каждом сеансе до истечения срока действия файла cookie.
  3. Храните SecurityContext более устойчиво, чем сеанс.

Подводя итог, я думаю, что ваша проблема не в разных точках входа, а в разных сессиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...