2014-08-19 12 views
13

मैं उपयोगकर्ता मूल वस्तु में अतिरिक्त डेटा सहेजने की कोशिश कर रहा हूं।वसंत सुरक्षा कस्टम उपयोगकर्ता विवरण सेवा और कस्टम उपयोगकर्ता वर्ग

मैं क्या किया था:

जहाँ मेरे अतिरिक्त डेटा सहेजा जाता है मेरे मौजूदा उपयोगकर्ता वर्ग के लिए "UserDetails" इंटरफ़ेस को लागू (ईमेल पते की तरह आदि)।

@Service 
public class UserDetailsServiceImpl implements UserDetailsService { 

    @Autowired 
    UserDAO userDAO; 

    @Override 
    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException { 
     User user = userDAO.findOneByUsername(username); 
     if (user == null) 
      throw new UsernameNotFoundException("username " + username 
        + " not found"); 

     System.out.println("---------------------> FOUND ------------->" 
       + user.getEmail()); 

     return user; 
    } 

} 

अंतिम चरण मेरी सुरक्षा विन्यास में UserDetailsService जोड़ने के लिए किया गया था:

@Entity 
public class User implements UserDetails { 

तो मैं एक UserDetailsService कार्यान्वयन बनाया।

@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

@Autowired 
UserDetailsService userDetailsService; 



@Override 
protected void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
    auth.userDetailsService(userDetailsService()); 
// ... 

} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.userDetailsService(userDetailsService()); 
// ... 
} 

@Override 
protected UserDetailsService userDetailsService() { 
    return userDetailsService; 
} 

मैं अपने कंसोल में देखता हूं कि "loadUserByName" को दो बार बुलाया जाता है ("पाया" आउटपुट के कारण)।

जब मैं अपने नियंत्रक में प्रिंसिपल वस्तु तक पहुँचने का प्रयास ->

System.out.println(SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal()); 

मैं अपने अतिरिक्त डेटा प्राप्त नहीं है। जब मैं इसे अपने उपयोगकर्ता ऑब्जेक्ट पर डालने का प्रयास करता हूं तो मुझे अपवाद नहीं मिला।

क्या मुझे कुछ भी याद आ रही है ??

अग्रिम धन्यवाद।

उत्तर

11

ठीक है। मेरी समस्या उस कोड में छिपी हुई थी जिसे मैंने पोस्ट नहीं किया था।

मैंने यह विवरण सोचा सेवा केवल अतिरिक्त विवरण प्राप्त करने के लिए है, लेकिन इसका उपयोग लॉगिन के लिए भी किया जाता है।

मेरे पास "jdbc प्रमाणीकरण" कॉन्फ़िगर किया गया था और वसंत हमेशा इसका उपयोग करना प्रतीत होता था।

अब मुझे केवल विवरण मिल गया है सेवा कॉन्फ़िगर किया गया सब कुछ ठीक काम करता है।

संपादित .:

तो मैं केवल इस कोड को नष्ट करने के लिए किया था:

auth.jdbcAuthentication() .dataSource(dataSource) 
    * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
// .... 

और अब यह भी ऊपर सवाल में मेरे कोड के साथ काम करता है।

0

Extention वर्ग बनाएँ:

public class CustomUserDetails extends org.springframework.security.core.userdetails.User{ 

    private User user; 

    public CustomUserDetails(User user, Collection<? extends GrantedAuthority> authorities) { 
     super(user.getName(), user.getPassword(), authorities); 
     this.user = user; 
    } 

    public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) { 
     super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
     this.user = user; 
    } 

    public User getUser() { 
     return user; 
    } 
} 

से UserDetailsService में जोड़ें:

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService { 
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException { 
    UserDetails userDetails = null; 
    User user = userService.getByLogin(login); 
    userDetails = new CustomUserDetails(user, 
       true, true, true, true, 
       getAuthorities(user.getRole())); 

    return userDetails; 
} 

यह हो जाओ!

(CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal() 
+0

इससे कुछ भी नहीं बदला। बीटीडब्ल्यू। आपका अंतिम कोड स्निपेट मुझे देता है: "java.lang.ClassCastException: org.springframework.security.core.userdetails.User को नहीं डाला जा सकता .......... कस्टम यूज़र विवरण" – jvecsei

+0

क्या आप अपना ऐप डीबग कर सकते हैं और कह सकते हैं कौन सी कक्षा 'SecurityContextHolder.getContext() प्राप्त करेगी। प्रमाणीकरण()। getPrincipal() '? –

+0

कक्षा org.springframework.security.core.userdetails।उपयोगकर्ता – jvecsei

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