2014-08-19 18 views
13

Tôi đang cố gắng lưu dữ liệu bổ sung trong đối tượng chính của người dùng de.Bảo mật mùa xuân tùy chỉnh UserDetailsService và tùy chỉnh Lớp người dùng

Những gì tôi đã làm là:

thực hiện "UserDetails" giao diện cho lớp người dùng hiện có của tôi, nơi dữ liệu bổ sung của tôi được lưu (như địa chỉ email vv).

@Entity 
public class User implements UserDetails { 

Sau đó, tôi đã tạo ra một thực hiện UserDetailsService:

@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; 
    } 

} 

Bước cuối cùng là thêm UserDetailsService trong cấu hình an ninh của tôi.

Tôi thấy trong bảng điều khiển của mình rằng "loadUserByName" được gọi hai lần (vì đầu ra "Tìm thấy").

Khi tôi cố gắng để truy cập vào các đối tượng chính trong bộ điều khiển của tôi ->

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

tôi không nhận được dữ liệu bổ sung của tôi. Khi tôi cố gắng truyền nó đến đối tượng người dùng của tôi, tôi nhận được một không thể bỏ ngoại lệ.

Tôi có thiếu gì không ??

Cảm ơn bạn trước.

Trả lời

11

Ok. Vấn đề của tôi đã được ẩn trong mã tôi đã không đăng bài.

Tôi nghĩ chi tiết nàyDịch vụ chỉ để nhận thêm chi tiết nhưng nó được sử dụng cho chính bản thân đăng nhập.

Tôi đã định cấu hình "jdbcAuthentication" bổ sung và mùa xuân dường như luôn sử dụng điều này.

Bây giờ tôi chỉ có các chi tiếtService cấu hình mọi thứ hoạt động tốt.

chỉnh sửa .:

vì vậy tôi chỉ phải xóa mã này:

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

Và bây giờ nó cũng làm việc với mã của tôi trong câu hỏi trên.

0

Tạo lớp 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; 
    } 
} 

Thần thêm nó vào 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; 
} 

lấy nó!

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

Điều đó đã không thay đổi bất cứ điều gì. Btw. đoạn mã cuối cùng của bạn cho tôi: "java.lang.ClassCastException: org.springframework.security.core.userdetails.User không thể truyền tới .......... CustomUserDetails" – jvecsei

+0

bạn có thể gỡ lỗi ứng dụng của mình và nói không lớp nào sẽ trả về 'SecurityContextHolder.getContext(). getAuthentication(). getPrincipal()'? –

+0

lớp org.springframework.security.core.userdetails.Người dùng – jvecsei

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