2011-12-16 27 views
8

Uygulamamda Spring Security uygulamasını hayata geçirdim. Varsayılan uygulamayı kullandım, yani kendi parametrelerimle (DataSource, Güvenli Alanlar, vb.) Yapılandırdım, ancak herhangi bir Özel uygulama yazmadım.Daha fazla bilgi için bkz. Kullanıcı - Yay Güvenliği

Şimdi, kullanıcı adından daha fazla veri yakalamak istiyorum, bu kullanıcı adı ve parola gibi, şirket adı, kimliği vb. Ile aynı tabloda. Ancak, bu bilgiyi giriş yapmak için kullanmak istemiyorum.

Nasıl yapılacağından emin değilim. Okuduğumdan, UserDetailsService ile ilgilidir. Ancak, bu bilgileri giriş sırasında kullanmak istediğimde özel bir UserDetailsService yazmanın gerekli olacağını ve bu benim istediğim gibi görünmüyor. Ben sadece kullanıcı bilgilerini girdikten sonra uygulama içinde kullanmak istiyorum.

Bu gerçekten UserDetailsServer ile ilgili mi? Değiştirmem gereken tek dosya bu mu? Ben özel UserDetailsService bulundu

Tüm örnekler sadece kullanıcı adı ve şifre kullanmış, böylece yeni veri gelirdi nerede anlayamıyorum.

Teşekkür! UserDetailsService geçersiz kılma

cevap

14

biz .. Kendi UserDetailsService ve kendi UserDetails uygulamak gerekir nesne ne yaptığını geçerli:

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

     Account account = accountDAO.findAccountByName(username); 

     if (account == null) { 
      throw new UsernameNotFoundException("account name not found"); 
     } 
     return buildUserFromAccount(account); 
    } 


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

     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;} 
} 
+0

'loadUserByUsername' UserDetails döndürür, ancak kodda, döndürür' buildUserFromAccount' Bu bir Kullanıcı döndürür. Peki, CustomUserDetails kodda nasıl yer alıyor? Hesap DAO sınıfı ve tüm bu yöntemler benim tarafımdan uygulanmalı, doğru mu? –

+0

İçinde biraz yazım hatası vardı ve düzeltildi. Daha fazla açıklamak gerekirse: 'KullanıcıDetayları' arabirimdir, 'Kullanıcı' tüm temel alanları içeren bahar-menkul kıymet uygulamasıdır. Kendi alanlarınızı eklemek istiyorsanız, yapılacak en kolay şey 'Kullanıcı’yı genişletmektir. Bu yöntemde bir 'User' nesnesini veya bir" UserDetails "nesnesini veya bir" CustomUserDetails "nesnesini, spring Security yalnızca" UserDetails "i uygulayan bir nesneyi beklediği için döndürebilirsiniz. – Pete

+0

Ah, Tamam! Bunu kullanarak, kimlik doğrulaması için her türlü Spring Security gereksinimini sağlarım. Ancak, sahip olduğu Kullanıcı nesnesi tüm özel alanlara sahiptir. Öyleyse, bu nesneyi nasıl alabilirim, yani örneğin 'Şirket' alabilirim? –

İlgili konular