2012-02-15 11 views
7

Ho già accesso al modulo e autenticazione di base che lavorano fianco a fianco con l'aiuto di uno DelegatingAuthenticationEntryPoint.Gestione dell'autenticazione di base sia in formato sia HTTP con origini diverse

Quello che sto cercando di fare è far passare gli utenti attraverso il modulo di login per essere autenticati rispetto ai criteri "A", e chiedere agli utenti che arrivano attraverso le richieste di autenticazione di base di essere autenticati rispetto ai criteri "B".

Alcune delle risorse dell'applicazione sono esposte tramite un servizio RESTful (accessibile tramite l'autenticazione di base). Invece di fare in modo che gli utenti inseriscano le proprie credenziali per effettuare una chiamata al servizio REST, possono inserire coppie chiave/valore generate da utilizzare esclusivamente con il servizio REST che può essere successivamente revocato dall'utente o dall'amministratore dell'app.

Preferirei condividere il maggior numero possibile di bean specifici per la sicurezza tra i due metodi di autenticazione. So che ho bisogno di separare UserDetailsService s come il modulo di accesso richiede la mia tabella users e l'autenticazione di base interrogherà la mia tabella service_credentials.

Qual è il modo corretto per ottenere questo tipo di configurazione in Spring Security?

risposta

13

A seconda della vostra applicazione e se si sta utilizzando Spring Security 3.1, si potrebbe essere migliore di suddividere la configurazione in più catene di filtri, ognuno con un responsabile di autenticazione separato definito:

<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> 

Invece del pattern attributo è inoltre possibile utilizzare l'attributo request-matcher-ref per specificare un'istanza RequestMatcher che verrà utilizzata per associare le richieste in arrivo a una particolare catena di filtri. Questo ha un'interfaccia molto semplice, ma può permetterti di abbinare in base a qualcosa di diverso dal percorso dell'URL, come l'intestazione Accept.

+0

Eccellente! My DelegatingAuthenticationEntryPoint utilizza alcuni RequestMatchers. –

1

Con SpringSecurity (3.2.3.RELEASE) funzionano gran forma così come autenticazione di base:

<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

Apprezzo molto che tu abbia dedicato del tempo per aggiungere queste informazioni per le persone che hanno rivisitato questo post nella versione più recente di spring sec. –

Problemi correlati