2011-12-16 31 views
8

Tôi đã triển khai Spring Security trong ứng dụng của mình. Tôi đã sử dụng cài đặt mặc định, tức là, tôi đã định cấu hình nó với các tham số của riêng mình (DataSource, Khu vực được bảo mật, v.v.), nhưng tôi chưa viết bất kỳ triển khai Custom nào.Tìm hiểu thêm thông tin từ User - Spring Security

Bây giờ tôi muốn thu thập thêm dữ liệu từ người dùng, trên cùng bảng với tên người dùng và mật khẩu, như tên công ty, id, v.v. Tuy nhiên, tôi không muốn sử dụng thông tin này để đăng nhập.

Tôi không chắc chắn cách thực hiện. Từ những gì tôi đã đọc, nó liên quan đến UserDetailsService. Tuy nhiên, có vẻ như việc viết một Custom UserDetailsService sẽ là cần thiết nếu tôi muốn sử dụng thông tin này trong quá trình đăng nhập, và đó không phải là những gì tôi muốn. Tôi chỉ muốn sử dụng thông tin này bên trong ứng dụng, sau khi người dùng đã đăng nhập.

Có thực sự liên quan đến UserDetailsServer không? Đây có phải là tệp duy nhất tôi phải sửa đổi không?

Tất cả các ví dụ tôi thấy các UserDetailsService tùy chỉnh chỉ sử dụng tên đăng nhập và mật khẩu, vì vậy tôi không thể hiểu nơi dữ liệu mới sẽ đến trong.

Cảm ơn!

Trả lời

14

Trọng sự UserDetailsService là những gì chúng tôi đã làm .. Bạn sẽ cần phải thực hiện UserDetailsService của riêng bạn và UserDetails của riêng bạn phản đối:

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' trả UserDetails, nhưng trong các mã, nó sẽ trả về' buildUserFromAccount' trả về một Người dùng. Vậy, CustomUserDetails tham gia vào mã như thế nào? Lớp Tài khoản DAO và tất cả các phương pháp của nó nên được thực hiện bởi tôi, đúng không? –

+0

Đã có một lỗi nhỏ trong đó và sửa nó. Để giải thích thêm: 'UserDetails' là giao diện,' Người dùng' là triển khai chứng khoán xuân bao gồm tất cả các trường cơ bản. Nếu bạn muốn thêm các trường của riêng bạn, điều dễ nhất cần làm là mở rộng 'Người dùng'. Bạn vẫn có thể trả về một đối tượng 'User' trong phương thức đó hoặc một đối tượng' UserDetails' hoặc một đối tượng 'CustomUserDetails' làm bảo mật mùa xuân chỉ mong đợi một đối tượng thực hiện' UserDetails'. – Pete

+0

Ah, Ok! Vì vậy, bằng cách sử dụng này, tôi đang cung cấp bảo mật Spring everyting cần xác thực. Tuy nhiên, đối tượng User mà nó chứa có tất cả các trường tùy chỉnh của tôi. Vì vậy, làm thế nào để có được đối tượng này, vì vậy tôi có thể 'getCompany' chẳng hạn? –

Các vấn đề liên quan