2011-01-05 3 views
0

은 내가 DaoAuthenticationProvider 여기에 같은 설명이 있습니다봄 보안 userCache 무효화

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

나는 또한 (이이 문서에서 설명하는 것 또한 같은) 캐시를 가지고있다.

문제는 좋은 사용자 이름 (이미 캐시에 있음)이 있지만 잘못된 암호 인 경우 좋은 사용자 이름/암호 인 것처럼 캐시에서 사용자를 반환한다는 것입니다. 사용자 이름을 키로 사용하므로 암호가 전혀 관련되지 않습니다.

캐시에서 사용자를 반환 정확한 코드 :

UserDetails user = this.userCache.getUserFromCache(username); 

이 사람이 그 어느 때이 문제를 처리 했습니까? 암호가 같은지 확인할 수도 있지만 맞춤 설정이됩니다.

감사합니다.

+0

요청에 따라 사용자 이름과 암호가 전송됩니까? 그렇다면 캐싱이 이치에 맞지 않는다고 생각합니다. – Raghuram

+0

DAO 호출을 저장하려면 의미가 있습니다. –

답변

2

는 표준 구성 요소를 사용하여 응용 프로그램을 구성한 경우 다음과 같은 시나리오가 있어야한다 :

  1. Authentication 객체가 생성되고 사용자가 제공 한 사용자 이름과 암호로 채워집니다 사용자 요청 도착시.

  2. 사용자 정보가 검색됩니다 그것이 가능하다면, UserCache가 이전에 캐시 된 사용자 정보를 검색하는 데 사용됩니다 (즉 getUserFromCache이 중 하나라고 UserDetailsService 또는 AuthenticationProviderAuthenticationManager에 대한 호출이 수행 전에 의 구현에 의해). 그리고 캐시의 사용자 정보가 좋은 암호와 함께 제공 될 것이므로 100 % OK입니다.

  3. 기본 사전 인증 검사 (자격 증명 만료 등) 후에 실제 인증이 수행됩니다. 이 시점에서 캐시 된 사용자 정보의 비밀번호는 Authentication 오브젝트에 저장된 비밀번호 (현재 잘못된 비밀번호가 들어 있음)와 비교됩니다. 이 시점에서 인증 시도는 실패합니다.

그러나, 당신은 자신의AuthenticationProvider 또는 AuthenticationManager, 당신은 암호 검사에 대한 책임이 있습니다 당신 구현하는 경우.

+0

결국 나는 사용자 지정 AuthenticationProvider를 가졌기 때문에 내 자신의 암호 확인을해야했습니다. 감사. –

0

원래 DB에서 사용자를 가져 와서 캐시하는 코드는 무엇입니까? 암호를 확인합니까? Spring Security는 사용자가 어디에서 왔는지 (DB 또는 캐시)를 알지 않아야하며 동일한 논리를 사용해야합니다.

+0

예, 원래 비밀번호를 가져오고 비밀번호와 함께 사용자 객체를 캐시합니다. 그러나 다음 요청이 오면 Spring은 사용자 이름에 따라 사용자가 캐시되었는지 확인합니다. 캐시에 있으면 인증이 성공했다고 가정합니다. 그게 문제 야. –