2016-03-21 11 views
0

ich zwei Federprofile aufweisen, die voneinander unabhängig sind, wie unten:Tag Authentifizierungs-Manager mit optionalem Anbieter Bohne

<beans profile="prof1"> 
    <security:authentication-manager id="authenticationManager" erase-credentials="true"> 
     <security:authentication-provider ref="1" /> 
     <security:authentication-provider ref="2" /> 
     <security:authentication-provider ref="3" /> 
    </security:authentication-manager> 
</beans> 

<beans profile="prof2" > 
    <security:authentication-manager id="authenticationManager" erase-credentials="true"> 
     <security:authentication-provider ref="0" /> 
     <security:authentication-provider ref="1" /> 
     <security:authentication-provider ref="2" /> 
     <security:authentication-provider ref="3" /> 
    </security:authentication-manager> 
</beans> 

Zum Beispiel kann ich Profil auf folgende Weise aktivieren:

|prof1|prof2| 
|true |true | 
|true |false| 
|false|true | 
|false|false| 

Wenn die letzte Option angegeben ist Frühling beschweren, dass Authentifizierung-Manager ist vermisst.

Um dies zu beheben, suchte ich nach etwas wie "optionale Referenz auf Frühlingsbohne".

nämlich war der Ideenmanager aus dem Profil zu extrahieren wie unten:

<security:authentication-manager id="authenticationManager" erase-credentials="true"> 
      <security:authentication-provider ref="0-optional-reference" /> 
      <security:authentication-provider ref="1" /> 
      <security:authentication-provider ref="2" /> 
      <security:authentication-provider ref="3" /> 
     </security:authentication-manager> 

Dann Bohne macht mit dem Namen „0“ als optionale Bohne. Ich habe den folgenden Beitrag Optional Spring bean references gefunden, aber es sieht aus wie jede Option funktioniert nicht für mich, weil ich "Ref" Attribut mit "Wert" wegen der Feder xsd nicht ersetzen kann.

Es wäre gut zu wissen, Optionen, wie kann ich optionale Bean für Authentifizierung-Provider Feder-Tag angeben.

Antwort

0

Frühling beschwert sich, weil, wenn weder Profile aktiv sind, erklärt die Bohnen Definitionen in den prof1 und prof2<beans> Blöcke nicht berücksichtigt werden und daher nicht in der BeanFactory geladen. So zur Laufzeit findet Spring Security keine Bean des Typs AuthenticationManager und beschwert sich.

Was Sie tun können, ist eine „default“ AuthenticationManager in einem neuen <beans> Block deklarieren, die nur dann aktiv ist, wenn weder prof1 noch prof2 aktiv sind:

<beans profile="!prof1 !prof2"> 
    <security:authentication-manager id="authenticationManager"> 
    ... 
    </security:authentication-manager> 
</beans> 
+0

Dank Olivier für die schnelle Antwort. Ich denke nur an den Fall, wenn beide Profile aktiv sind. Und welches wird als gültig angesehen werden. Es sieht so aus, als wären beide Deklarationen , gültig. – fashuser

+0

Wenn beide Profile aktiv sind, werden die 2 'AuthenticationManagers' für die Injektion verfügbar und haben das gleiche" Gewicht ", was dazu führen kann, dass Spring mehrere Implementierungen eines bestimmten Bean-Typs findet. Um dieses Problem zu lösen, können Sie eines als "primary" markieren: '', so dass es Vorrang hat während der Injektionssuche. –

+0

Ich habe dies für Bohnen-Tag versucht, aber es sieht aus wie es nicht von Frühling xsd erlaubt ist, ein solches Attribut zu setzen. Ist es möglich, stattdessen ein anderes Attribut anzugeben? – fashuser

Verwandte Themen