7.2. 설정

DaoAuthenticationProvider를 여러분의 ProviderManager 목록에 추가하는 것 (참조 가이드의 시작부분에서 논의했던)과 적절한 인증 메커니즘이 UsernamePasswordAuthenticationToken을 제공하도록 설정하는 것을 별도의 문제로 생각하면 DaoAuthenticationProvider 자체를 설정하는 것은 상대적으로 간단하다:

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <property name="userDetailsService"><ref bean="inMemoryDaoImpl"/></property>
  <property name="saltSource"><ref bean="saltSource"/></property>
  <property name="passwordEncoder"><ref bean="passwordEncoder"/></property>
</bean>        

PasswordEncoderSaltSource는 선택사항이다. PasswordEncoder는 설정된 UserDetailsService로부터 반환된 UserDetails 객체에 들어있는 비밀번호의 인코딩과 디코딩을 제공한다. SaltSource는 비밀번호에 "양념(salt)"을 뿌릴 수 있도록 하는데, 이러한 salt는 인증 저장소에 들어있는 비밀번호의 보안을 강화해준다. Acegi Security에서 제공되는 PasswordEncoder 구현체로는 MD5, SHA, 클리어텍스트(cleartext) 인코딩들이 있다. Acegi Security에는 두 개의 SaltSource 구현체가 제공되는데, 모든 비밀번호에 대하여 동일한 salt로 인코딩을 수행하는 SystemWideSaltSource와, 반환된 UserDetails 객체의 프로퍼티를 검사하여 salt를 획득하는 ReflectionSaltSource가 있다. 선택적인 기능들에 관해 자세히 알아보려면 JavaDoc을 참조하길 바란다.

위 프로퍼티에 추가하여 DaoAuthenticationProviderUserDetails 객체에 대한 선택적인 캐싱을 지원한다. UserCache 인터페이스는 DaoAuthenticationProviderUserDetails 객체를 캐시에 위치할 수 있도록 해주어 동일한 사용자명으로 이어지는 인증 시도에 대해 캐시로부터 검색할 수 있도록 한다. 기본적으로 DaoAuthenticationProviderNullUserCache를 사용하는데, NullUserCache는 아무런 캐싱도 수행하지 않는다. 사용하기에 편리한 캐싱 구현체로는 EhCacheBasedUserCache가 있으며 다음과 같이 설정한다:

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <property name="userDetailsService"><ref bean="userDetailsService"/></property>
  <property name="userCache"><ref bean="userCache"/></property>
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation">
    <value>classpath:/ehcache-failsafe.xml</value>
  </property>
</bean>

<bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  <property name="cacheManager">
    <ref local="cacheManager"/>
  </property>
  <property name="cacheName">
    <value>userCache</value>
  </property>
</bean>

<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
  <property name="cache"><ref local="userCacheBackend"/></property>
</bean>        

Acegi Security EH-CACHE의 구현체(EhCacheBasedUserCache 포함)들은 모두 EH-CACHE Cache 객체를 필요로 한다. Cache 객체는 여러분이 원하는 어디에서도 획득할 수 있지만 위 설정에서 볼 수 있는 것과 같이 Spring의 팩토리 클래스를 사용할 것을 권장한다. 만약 Spring의 팩토리 클래스를 사용할 경우 캐시 저장소 위치, 메모리 사용, 추방 정책, 시간 제한 등의 최적화 방법에 관한 자세한 내용은 Spring 문서를 참조하길 바란다.

DaoAuthenticationProvider에서는 설계상 계정 잠금(account locking)을 지원하지 않기로 결정하였는데, 계정 잠금을 지원할 경우 UserDetailsService 인터페이스의 복잡성이 증가하였을 것이기 때문이다.즉, 예를 들자면 실패한 인증 시도의 횟수를 증가시키는 메소드도 필요하게 될 수 있다. 그러한 기능은 아래에서 설명할 애플리케이션의 공표(publishing) 기능을 이용하여 손쉽게 제공할 수 있다.

DaoAuthenticationProvider는 인증주체의 프로퍼티 집합을 포함하는 Authentication 객체를 반환한다. 인증주체는 String(본질적으로는 사용자명)이나 UserDetails 객체(UserDetailsService로부터 탐색되는)가 될 것이다. 기본적으로는 UserDetails가 반환되며, 따라서 애플리케이션에서는 잠재적으로 애플리케이션에서 사용할 사용자의 전체 이름, 전자메일 주소 등의 추가적인 프로퍼티를 추가할 수 있다. 컨테이너 어댑터(container adapter)를 사용하고 있거나, 여러분의 애플리케이션이 String(Acegi Security 0.6 이전 버전의 경우)으로 동작하도록 작성되어 있을 경우 애플리케이션 컨텍스트에서 DaoAuthenticationProvider.forcePrincipalAsString 프로퍼티를 true로 지정해야 한다.