2015-01-30 2 views
1

이 질문을하는 것보다 더 많은 답변입니다 - 이것을 찾는 다른 사람들을 위해 문서화.봄 oauth ClientDetailsService에 캐시를 적용하는 방법

우리는 Spring JdbcClientDetailsService를 사용하고 있으며 현재 버전 2.0.5에서는 리소스 요청/토큰 요청 당 두 개 이상의 쿼리를 생성하며 성능 문제가 발생할 수 있습니다. 그래서 우리는이 서비스에 캐시를 넣기 위해 Spring 팀의 조언 (릴리스 2.0.3에서)을 따랐습니다.

우리는 이미 ehcache 설정을 했으므로 몇 가지 aop 선언이 필요합니다.

업데이트 이제 토큰 및 인증 개체에 캐시를 추가하는 방법에 대해 살펴 보았습니다.이 캐시도 많이 쿼리되었습니다. 하지만 거기에 TokenStore.readAuthentication에 문제가있는 것으로 판명 - 나는 방법 과부하에 문제가있는 것 같아요, 하나의 서명이 봄이고 다른 하나는 토큰 객체입니다.

나는 이런 식으로 뭔가를 시도했다하지만

<aop:advisor advice-ref="authByTokenIdAdvice" pointcut="execution(* org.springframework.security.oauth2.provider.token.TokenStore.readAuthentication(String))"/> 

사람이 아이디어를 가지고 작동하지 않았다?

+0

고마워요! ehcache 설정을 보여 주시겠습니까? – alexanoid

+0

대단히 감사합니다! 한 가지 더 질문 - accessToken 성능 문제를 해결하는 데 도움이 되었습니까? 비슷한 비슷한 것 같습니다. http://stackoverflow.com/questions/30175068/spring-rest-oauth2-resource-server-and-performance-issue – alexanoid

답변

2

이것은 클라이언트 세부 정보를 캐싱하기위한 것입니다. 클러스터는 비 클러스터 환경에서만 관련이 있습니다. 클라이언트 서비스를 무시하고 캐시 된 항목을 지우라는 메시지를 다른 노드에 보냅니다.

<cache:advice id="cacheClientsAdvice" cache-manager="cacheManager"> 
      <cache:caching cache="OauthClientDetailsServiceCache"> 
       <cache:cacheable method="loadClientByClientId" key="#clientId"/> 
      </cache:caching> 
     </cache:advice> 
     <cache:advice id="cacheEvictClient" cache-manager="cacheManager"> 
      <cache:caching cache="OauthClientDetailsServiceCache"> 

       <cache:cache-evict method="removeClientDetails" key="#clientId" before-invocation="false"/> 
      </cache:caching> 
     </cache:advice> 

     <!-- apply the cacheable behavior to all ClientDetailsService interface methods --> 
     <aop:config> 
      <aop:advisor advice-ref="cacheClientsAdvice" pointcut="execution(* org.springframework.security.oauth2.provider.ClientDetailsService.*(..))"/> 
     </aop:config> 
     <aop:config> 
      <aop:advisor advice-ref="cacheEvictClient" pointcut="execution(* org.springframework.security.oauth2.provider.ClientRegistrationService.*(..))"/> 
     </aop:config>