Spring Security 2.0.4 – namespace-based configuration. Teil 2.

Beim Einsatz der namespace-Konfiguration registriert Spring Security im Hintergrund automatisch einen ProviderManager. Wenn nun (ebenfalls via namespace-Konfiguration) ein oder mehrere AuthenticationProvider konfiguriert werden, so werden sie automatisch dem ProviderManager bekannt gegeben. Dieser delegiert dann die eigentliche Authentifizierung an die konfigurierten AuthenticationProvider und erlaubt somit eine flexible Gestaltung der Authentifizierungslogik. Beispielsweise kann Spring Security den User erst gegen LDAP Server A authentifizieren, bei Misserfolg dann LDAP Server B anfragen.

Zurück zum Konfigurationsbeispiel aus Teil 1: Es ist noch unvollständig, da ein AuthenticationProvider fehlt. Spring Security liefert eine Reihe von Standardimplementierungen mit:

  • DaoAuthenticationProvider
  • LdapAuthenticationProvider
  • OpenIDAuthenticationProvider
  • CasAuthenticationProvider

Für das nächste Codebeispiel entscheiden wir uns für den DaoAuthenticationProvider, der Userattribute wie username oder password aus einem UserDetailService bezieht.

  1. <s:http>
  2.     <s:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
  3.     <s:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY " />
  4.     <s:http-basic />
  5.     <s:anonymous />
  6.   </s:http>
  7.  
  8.   <s:authentication-provider>
  9.     <s:user-service>
  10.       <s:user name="pmeier" password="secret" authorities="ROLE_USER, ROLE_ADMIN"/>
  11.       <s:user name="hmueller" password="geheim" authorities="ROLE_USER"/>
  12.     </s:user-service>
  13.   </s:authentication-provider>

Mit dieser Konfiguration haben wir zwei statische User angelegt. Mit pmeier und hmueller kann man sich nun an der Webapplikation anmelden. Was passiert aber im Hintergrund ?
Das Tag authentication-provider registriert einen DaoAuthenticationProvider. Diesem Provider wird über das Tag user-service ein UserDetailsService vom konkreten Typ InMemoryDaoImpl übergeben und mit zwei Usern statisch konfiguriert.

Alternativ hätte man für das gleiche Resultat folgendes schreiben können:

  1. <!-- DaoAuthenticationProvider with InMemoryDaoImpl -->
  2. <bean id="InMemoryProvider"
  3. class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
  4.   <s:custom-authentication-provider />
  5. <property name="userDetailsService">
  6.     <bean class="org.springframework.security.userdetails.memory.InMemoryDaoImpl">
  7. <property name="userMap">
  8.         <value>
  9.           pmeier=secret,ROLE_USER, ROLE_ADMIN
  10.           hmueller=geheim,ROLE_USER
  11.         </value>
  12.       </property>
  13.     </bean>
  14.   </property>
  15. </bean>

Wichtig bei dieser Alternative ist das custom-authentication-provider Tag. Es sorgt dafür, das der ProviderManager unseren InMemoryProvider überhaupt kennt.

Im nächsten Teil sehen wir uns die Konfiguration für zwei LDAP Server an.

Bookmark and Share

Leave a Reply