2014-07-27 18 views
12

मैंने स्प्रिंग सुरक्षा फ्रेमवर्क के माध्यम से उपयोगकर्ता प्रमाणीकरण लागू किया है और सब कुछ ठीक काम करता है। मैं में प्रवेश करें और लॉग आउट कर सकते हैं, मैं इस तरह के उदाहरण के लिए उपयोगकर्ता नाम लॉग इन कर सकते हैं:स्प्रिंग सुरक्षा उपयोगकर्ता ऑब्जेक्ट

String userName = ((UserDetails) auth.getPrincipal()).getUsername(); 

अब मैं डेटाबेस से एक वस्तु (i प्रयोक्ता आईडी और अन्य उपयोगकर्ता गुण की जरूरत है) की तरह उपयोगकर्ता प्राप्त करना चाहते हैं।

यह कैसे मैं अब तक की कोशिश की है:

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

इसके बाद मैं अपवाद निम्न गया:

Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to net.viralpatel.contact.model.User 

यहाँ एक सवाल है - मैं कैसे वस्तु के रूप में उपयोगकर्ता प्राप्त कर सकते हैं, मैं कैसे को संशोधित करना चाहिए मेरी कक्षाएं UserDetailsServiceImpl और UserAssembler, कोई विचार?

@Component 
@Transactional 
public class UserDetailsServiceImpl implements UserDetailsService{ 

    @Autowired 
    private UserDAO userDAO; 

    @Autowired 
    private UserAssembler userAssembler; 

    private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class); 

    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     User user = userDAO.findByEmail(username); 

     if(null == user) throw new UsernameNotFoundException("User not found"); 
     return userAssembler.buildUserFromUser(user); 
    } 
} 

और एक और एक:

@Service("assembler") 
public class UserAssembler { 

    @Autowired 
    private UserDAO userDAO; 

    @Transactional(readOnly = true) 
    public User buildUserFromUser(net.viralpatel.contact.model.User user) { 
     String role = "ROLE_USER";//userEntityDAO.getRoleFromUserEntity(userEntity); 

     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     authorities.add(new GrantedAuthorityImpl(role)); 

     return new User(user.getLogin(), user.getPassword(), true, true, true, true, authorities); 
    } 
} 

उत्तर

0

यह वसंत का org.springframework.security.core.userdetails.User वर्ग का विस्तार नहीं में अपने प्रयोक्ता वर्ग की तरह दिखता है।

public class AuthenticUser extends User { 

     public AuthenticUser(String username, String password, boolean enabled, 
     boolean accountNonExpired, boolean credentialsNonExpired, 
     boolean accountNonLocked, 
     Collection<? extends GrantedAuthority> authorities) { 

     super(username, password, enabled, accountNonExpired, credentialsNonExpired, 
      accountNonLocked, authorities); 
    } 
    ..... 
    ..... 
} 

अब आप अपने कोड में इस वर्ग की एक वस्तु बना सकते हैं और स्प्रिंग प्रमाणीकरण प्रसंग के भाग के रूप में सेट कर सकते हैं:

यहाँ एक उदाहरण कोड में संदर्भ के लिए, मैं 'AuthenticUser' के रूप में नामित वर्ग कहा जाता है उदाहरण के लिए

AuthenticUser user = new AuthenticUser(username, password, .... rest of the parameters); 
    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, 
     user.getAuthorities()); 
    SecurityContextHolder.getContext().setAuthentication(authentication); 

यह आपके उपयोगकर्ता को प्रमाणित करेगा और उपयोगकर्ता को सुरक्षा संदर्भ में सेट करेगा।

+0

मेरे उपयोगकर्ता वर्ग सिर्फ इकाई – user3127896

+0

जैसा कि बताया जा रहा है कर सकते हैं कुछ कस्टम जानकारी की जरूरत है, तो आप बढ़ाने की जरूरत वसंत की उपयोगकर्ता कक्षा। –

+0

मुझे त्रुटि मिली - उपयोगकर्ता – user3127896

12

अनिवार्य रूप से, आपको UserDetails का कार्यान्वयन वापस करने की आवश्यकता है जो आपके User तक पहुंच प्रदान करता है।

आपके पास दो विकल्प:

  • अपने User एक क्षेत्र के रूप में (आप इसे org.springframework.security.core.userdetails.User का विस्तार किया जा कर सकते हैं):

    public class UserPrincipal extends org.springframework.security.core.userdetails.User { 
        private final User user; 
        ... 
    } 
    

    और उस क्षेत्र से एक User प्राप्त:

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    User user = ((UserPrincipal) principal).getUser(); 
    
  • कक्षा बनाओ टी अपने User प्रदान करता है और लागू करता है UserDetails:

    public class UserPrincipal extends User implements UserDetails { 
        ... 
        public UserPrincipal(User user) { 
         // copy fields from user 
        } 
    } 
    

    यह दृष्टिकोण आप सीधे User को प्रिंसिपल कास्ट करने के लिए अनुमति देता है:

    User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    
0

आप अपनी खुद की UserDetailsService लागू करने की आवश्यकता है और अपने स्वयं के UserDetails वस्तु (आपकी इच्छा के अनुसार):

public class CustomService implements UserDetailsService { 
@Transactional(readOnly = true) 
public UserDetails loadUserByUsername(String userId) { 

    Account account = accountDAO.findAccountByName(userId); 

    // validation of the account 
    if (account == null) { 
     throw new UsernameNotFoundException("not found"); 
    } 
    return buildUserFromAccount(account); 
} 


@SuppressWarnings("unchecked") 
@Transactional(readOnly = true) 
private User buildUserFromAccount(Account account) { 

    // take whatever info you need 
    String username = account.getUsername(); 
    String password = account.getPassword(); 
    boolean enabled = account.getEnabled(); 
    boolean accountNonExpired = account.getAccountNonExpired(); 
    boolean credentialsNonExpired = account.getCredentialsNonExpired(); 
    boolean accountNonLocked = account.getAccountNonLocked(); 

    // additional information goes here 
    String companyName = companyDAO.getCompanyName(account); 


    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    for (Role role : account.getRoles()) { 
     authorities.add(new SimpleGrantedAuthority(role.getName())); 
    } 

    CustomUserDetails user = new CustomUserDetails (username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, 
      authorities, company); 

    return user; 
} 


public class CustomUserDetails extends User{ 

// ... 
public CustomUserDetails(..., String company){ 
    super(...); 
    this.company = company; 
} 

private String company; 

public String getCompany() { return company;} 

public void setCompany(String company) { this.company = company;} 
} 

नोट:
इस उपयोगकर्ता वर्ग की डिफ़ॉल्ट कार्यान्वयन आप आपको लगता है कि आप एक कस्टम वर्ग बनाने के लिए और उपयोगकर्ता वर्ग का विस्तार

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