2015-11-19 10 views
9

मैंने वसंत सुरक्षा मॉड्यूल के साथ OAuth2 पासवर्ड अनुदान लागू किया है। मैं UserDetails और UserDetailsService (jdbc) का अपना कार्यान्वयन जोड़ता हूं। मैं अपने नियंत्रकों के साथ उपयोगकर्ता को इंजेक्ट करता हूं:स्प्रिंग ओथ 2 - रीलोड प्रिंसिपल

@AuthenticationPrincipal User user 

जहां उपयोगकर्ता उपयोगकर्ता विवरण का मेरा कार्यान्वयन है। अब मैं रीफ्रेशिंग टोकन के बिना उपयोगकर्ता डेटा बदलने की सकारात्मकता जोड़ना चाहता हूं।

मैं साथ प्रिंसिपलों ताज़ा करने का प्रयास:

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

लेकिन यह काम नहीं करता है, जब मैं अन्य नियंत्रक विधि यह रिटर्न पुराने उपयोगकर्ता वस्तु आह्वान।

क्या रीफ्रेशिंग टोकन के बिना उपयोगकर्ता डेटा बदलने का कोई तरीका है? वसंत सुरक्षा को हमेशा डेटाबेस से उपयोगकर्ता डेटा लोड करने का कोई समाधान है (कैश से नहीं)?

+0

आवेदन आप प्रिंसिपलों को ताज़ा करते परत जिसमें स्थापित करने के लिए? –

उत्तर

2

मुझे this answer से इसे प्राप्त करने का एक तरीका मिला। मैं HttpSessionSecurityContextRepository

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

बनाया है और यह हर अनुरोध पर अद्यतन उपयोगकर्ता जानकारियां लाने के लिए

.and() 
     .csrf() 
      .csrfTokenRepository(csrfTokenRepository()) 
    .and() 
     .securityContext() 
      .securityContextRepository(userDetailContextRepository()) 

नीचे नमूना कोड के रूप में WebSecurityConfigurerAdapter की कक्षा से मेरी HttpSecurity में जोड़ें। आप अपने एपीआई सर्वर या 0 oसे अपने oauth2 कॉन्फ़िगरेशन से प्राप्त कर सकते हैं।

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

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन यह सिर्फ एक अनुमान है, मैं तुम्हें तुम भी SecurityContext स्पष्ट करने की जरूरत है।

SecurityContextHolder.clearContext(); साथ सबसे पहले स्पष्ट सुरक्षा संदर्भ फिर अपना कोड प्रमाणीकरण

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

Oauth2 द्वारा सुरक्षित किए गए एप्लिकेशन 'UsernamePasswordAuthenticationToken' प्रकार प्रमाणीकरण के साथ असाइन नहीं कर सकते हैं। – Cataclysm

संबंधित मुद्दे