2012-02-15 4 views
7

У меня уже есть форма входа в систему и базовая функция auth, работающая бок о бок с помощью DelegatingAuthenticationEntryPoint.Обработка обеих форм и базовая аутентификация HTTP с различными источниками

То, что я пытаюсь сделать, заключается в том, чтобы пользователи проходили через форму входа, чтобы пройти аутентификацию по критерию «А», и чтобы пользователи проходили запросы Basic auth для проверки подлинности по критерию «B».

Некоторые ресурсы приложения отображаются через службу RESTful (доступны через Basic auth). Вместо того, чтобы пользователи вводили свои собственные учетные данные для вызова службы REST, они могут вводить сгенерированные пары ключ/значение для использования исключительно с службой REST, которая может быть позже отменена пользователем или администратором приложения.

Я бы предпочел разделить как можно больше моих компонентов, связанных с безопасностью, между двумя методами аутентификации. Я знаю, что мне понадобится отдельный номер UserDetailsService, так как форма входа запрашивает мою таблицу users, а Basic auth будет запрашивать мою таблицу service_credentials.

Каков правильный способ достижения такой конфигурации в Spring Security?

ответ

13

В зависимости от приложения и используете ли вы Spring Security 3.1, вы могли бы быть лучше, чтобы разделить конфигурацию на несколько цепочек фильтров, каждый из которых имеет отдельный менеджер аутентификации определяется:

<http pattern="/rest_api/**" create-session="stateless" 
    authentication-manager-ref="serviceCredsAuthMgr"> 
    <http-basic /> 
</http> 

<http authentication-manager-ref="mainAuthMgr"> 
    <form-login /> 
</http> 

<authentication-manager id="serviceCredsAuthMgr"> 
    <authentication-provider user-service-ref="serviceCredsUserDetailsSvc" /> 
</authentication-manager> 

<authentication-manager id="mainAuthMgr"> 
    <!-- whatever --> 
</authentication-manager> 

Вместо того pattern атрибут, вы также можете использовать атрибут request-matcher-ref для указания экземпляра RequestMatcher, который будет использоваться для сопоставления входящих запросов с определенной цепочкой фильтров. У этого есть очень простой интерфейс, но он может позволить вам соответствовать на основе чего-то другого, кроме URL-адреса, например заголовка Accept.

+0

Отлично! Мой DelegatingAuthenticationEntryPoint использует некоторые RequestMatchers. –

1

С SpringSecurity (3.2.3.RELEASE) работают прекрасной форме, а также базовой аутентификации:

<http pattern="/resources/**" security="none"/> 
<http pattern="/webjars/**" security="none"/> 

<http pattern="/rest/**" create-session="stateless" use-expressions="true"> 
    <intercept-url pattern="/**" access="isFullyAuthenticated()"/> 
    <http-basic /> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <http-basic/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <intercept-url pattern="/loginfailed" access="permitAll"/> 
    <intercept-url pattern="/logout" access="permitAll"/> 

    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed"/> 
    <logout logout-success-url="/logout"/> 
    <remember-me user-service-ref="userService"/> 
</http> 

<authentication-manager> 
    <authentication-provider user-service-ref="userService"> 
<!-- 
     <jdbc-user-service data-source-ref="dataSource" 
          users-by-username-query="SELECT email, password, enabled FROM users WHERE email = ?" 
          authorities-by-username-query=" 
             SELECT u.email, r.name FROM users u, roles r WHERE u.id = r.user_id and u.email = ?"/> 
--> 
<!-- 
     <user-service> 
      <user name="[email protected]" password="password" authorities="ROLE_USER"/> 
      <user name="[email protected]" password="admin" authorities="ROLE_ADMIN"/> 
     </user-service> 
--> 
    </authentication-provider> 
</authentication-manager> 
+1

Я очень ценю, что вы нашли время, чтобы добавить эту информацию для людей, которые пересматривали этот пост в новой версии весны. –

Смежные вопросы