2009-08-19 8 views

Répondre

6

Le résultat final que vous voulez est possible, j'ai couru dans ce même problème et est ma solution ici.

À tout moment, lors de la définition d'un formulaire de connexion dans l'espace de noms, il remplace automatiquement tous les autres filtres d'authentification que vous appliquez via l'espace de noms. Cela se fait à travers l'ordre de la chaîne de filtres regardez FilterChainOrder.java dans la sécurité de printemps pour voir comment la commande est effectivement appliquée à chaque filtre. Pour contourner ce problème, supprimez la balise http-basic de l'espace de noms, puis définissez manuellement le bean pour gérer l'authentification de base et placez son ordre devant AuthenticationProcessingFilter car il s'agit du filtre de sécurité de printemps qui gérera le formulaire-login. Le ressort BasicProcessingFilter permet de gérer l'authentification de base est un filtre passif, ce qui signifie que si les informations d'identification sont manquantes, il continuera dans la chaîne de filtre jusqu'à ce qu'il trouve le filtre approprié pour gérer la demande.

Maintenant, en définissant manuellement le bean BasicProcessingFilter, nous pouvons définir l'ordre dans lequel il apparaîtra dans la chaîne de filtres. est Ci-dessous un exemple des déclarations xml supplémentaires que vous devez fournir dans le fichier XML de sécurité (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> 

Notez également si votre référence AuthenticationManager ne se trouve pas, vous pouvez ajouter un alias votre espace de noms comme celui ci-dessous.

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

Le résultat final est le filtre de base sera appliqué comme un filtre passif et si ses informations d'identification requises manquent, il continuera dans la chaîne de filtre et le filtre de forme connexion sera alors gérer.

Le problème avec cette approche est que si les informations d'identification sont correctement entrées, la réponse est la page de connexion du filtre formulaire-connexion.

Cependant, il semble que ce problème sera résolu au printemps dans la version 3.1 de la sécurité de printemps et ce travail ne sera plus nécessaire.

10

Le response by @grimesjm a raison. Toutefois, si vous utilisez 3.x Spring vous devez adapter les noms de classe à:

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

Et

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

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

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

Je ne sais pas si placer le filtre avant SECURITY_CONTEXT_FILTER est la meilleure option ou non .

1

Il est maintenant possible avec Spring Security 3.1.0

+1

Ceci est correct, voici un lien qui va développer sur cette réponse: http://stackoverflow.com/questions/3671861/two-realms-in-same-application-with-spring-security –

+0

Je pense que le but est de L'API REST prend-elle en charge les deux authentifications dans le même domaine. Définir deux royaumes, c'est comme définir deux guerres - ça marche mais ce n'est pas idéal. – Eugen

Questions connexes