2015-11-19 39 views
9

Yay güvenlik modülü ile OAuth2 parola hibe başvurusu yaptım. UserDetails ve UserDetailsService (jdbc) 'nin kendi uygulamasını ekliyorum. Kullanıcı UserDetails benim uygulamasıdırSpring Oauth2 - yeniden yükleme esasları

@AuthenticationPrincipal User user 

: Ben ile benim denetleyicileri için kullanıcı enjekte edin. Şimdi, kullanıcı verilerini yenileme belirteci olmadan değiştirme olasılığını eklemek istiyorum.

Birlikte prensipleri yenilemek için çalışıyoruz:

User updatedUser = ... 
Authentication newAuth = new UsernamePasswordAuthenticationToken(updatedUser, updatedUser.getPassword(), updatedUser.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(newAuth); 

Ama eski Kullanıcı nesnesi döndüren başka denetleyici yöntemini çağırmak zaman, çalışmaz.

Kullanıcı verilerini yenileme belirteci olmadan değiştirmenin bir yolu var mı? Her zaman, kullanıcı verilerini veritabanından (Önbellekten değil) yüklemek için bahar güvenliği yapmak için herhangi bir çözüm var mı?

+0

kurulur? –

cevap

2

Bunu, this answer'dan elde etmenin bir yolunu buldum. Ben

@Bean 
public ReloadUserPerRequestHttpSessionSecurityContextRepository userDetailContextRepository() { 
    return new ReloadUserPerRequestHttpSessionSecurityContextRepository(); 
} 

HttpSessionSecurityContextRepository oluşturulan ve her istekleri güncellenir kullanıcı bilgileri almak için

.and() 
     .csrf() 
      .csrfTokenRepository(csrfTokenRepository()) 
    .and() 
     .securityContext() 
      .securityContextRepository(userDetailContextRepository()) 
Aşağıda

olduğu örnek kodları olarak WebSecurityConfigurerAdapter sınıfından benim HttpSecurity için bunu ekleyin. API sunucunuzdan veya oauth2 yapılandırmanızın user-info-url'dan alabilirsiniz.

public class ReloadUserPerRequestHttpSessionSecurityContextRepository extends HttpSessionSecurityContextRepository { 

    @Override 
    public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) { 
     SecurityContext context = super.loadContext(requestResponseHolder); 

     Authentication auth = context.getAuthentication(); 
     if (auth != null && auth instanceof OAuth2Authentication) { 
      OAuth2Authentication oldAuth = (OAuth2Authentication) auth; 
      if (oldAuth.getPrincipal() instanceof LinkedHashMap) { 
       createNewUserDetailsFromPrincipal(oldAuth.getPrincipal()); 
      } 
      context.setAuthentication(oldAuth); 
     } 
     return context; 
    } 

    @SuppressWarnings("unchecked") 
    private void createNewUserDetailsFromPrincipal(Object principal) { 
     LinkedHashMap<String, Object> userDetailInfo = (LinkedHashMap<String, Object>) principal; 
     // fetch User informations from your API server or your database or 
     // 'user-info-url' of oauth2 endpoint 
     userDetailInfo.put("name", "EDITED_USER_NAME"); 
    } 

} 
1

Emin değilim ama bu sadece bir tahmin olduğunu, seni de SecurityContext temizlemek gerek. SecurityContextHolder.clearContext(); ile

İlk açık güvenlik içeriği ardından kod doğrulaması Eğer müdürler yeniledikten uygulamanın hangi katmanında

Authentication newAuth = new UsernamePasswordAuthenticationToken(updatedUser, updatedUser.getPassword(), updatedUser.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(newAuth); 
+0

Oauth2 tarafından güvence altına alınan uygulamalar 'UsernamePasswordAuthenticationToken 'tipi kimlik doğrulaması ile atanamaz. – Cataclysm

İlgili konular