Spring безопасность - как упоминать как базовую, так и базовую аутентификацию

Можно ли упомянуть как базовую, так и базовую аутентификацию в безопасности Spring с использованием конфигурации пространства имен без переопределения других? Чтобы аппликация могла обслуживать как запрос на основе браузера, так и удаленный клиент.

Ответы

Ответ 1

Ответ от @grimesjm является правильным. Однако, если вы используете Spring 3.x, вам нужно адаптировать имена классов к:

<bean id="basicProcessingFilter" class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
    <property name="authenticationManager">
        <ref bean="authenticationManager" />
    </property> 
    <property name="authenticationEntryPoint">
        <ref bean="authenticationEntryPoint" />
    </property>
</bean>

<bean id="authenticationEntryPoint"
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
    <property name="realmName" value="Your realm here" />
</bean>

И

<sec:http auto-config="true">
    ... your intercept-url here

    <sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" />

    <sec:form-login ... />
    ....
</sec:http>

Я не знаю, является ли размещение фильтра до SECURITY_CONTEXT_FILTER лучшим вариантом или нет.

Ответ 2

Конечный результат, который вы хотите, возможен, я столкнулся с этой же проблемой, и вот мое решение.

В любое время при определении формы-входа в пространство имен он автоматически переопределяет любые другие фильтры проверки подлинности, которые вы применяете через пространство имен. Это делается путем упорядочения цепочки фильтров в FilterChainOrder.java в безопасности spring, чтобы увидеть, как порядок фактически применяется к каждому фильтру.

Чтобы обойти это, удалите тег http-basic из пространства имен, затем вручную определите bean для обработки базовой проверки подлинности и поместите свой заказ перед AuthenticationProcessingFilter, потому что это фильтр безопасности spring, который будет обрабатывать форму-логин,

BasicProcessingFilter spring обеспечивает обработку. Обычная проверка подлинности - это пассивный фильтр, что означает, что если учетные данные отсутствуют, он будет продолжать работу по цепочке фильтров, пока не найдет соответствующий фильтр для обработки запроса.

Теперь, вручную определяя BasicProcessingFilter bean, мы можем установить порядок его появления в цепочке фильтров. Ниже приведен пример дополнительных объявлений xml, которые вам нужно будет предоставить в xml безопасности (Spring Security < 3.x)

<bean id="basicProcessingFilter" class="org.springframework.security.ui.basicauth.BasicProcessingFilter">
    <property name="authenticationManager"><ref bean="authenticationManager"/></property>
     <security:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/>
    <property name="authenticationEntryPoint"><ref bean="authenticationEntryPoint"/></property>
</bean>

<bean id="authenticationEntryPoint"
    class="org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint">
              <property name="realmName" value="My Realm Here"/>
</bean>

Также обратите внимание, если ссылка на идентификатор authenticationManager не найдена, вы можете добавить псевдоним в пространство имен, подобное приведенному ниже.

<security:authentication-manager alias="authenticationManager"/>

Конечным результатом является то, что основной фильтр будет применяться как пассивный фильтр, и если его требуемые учетные данные отсутствуют, он продолжит работу по цепочке фильтров, и фильтр формы-входа затем обработает его.

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

Однако, похоже, эта проблема будет исправлена ​​ spring в версии 3.1 безопасности spring, и эта работа больше не понадобится.

Ответ 3

Теперь возможно с Spring Security 3.1.0