2013-02-05 53 views
10

Có cách nào để đặt List<GrantedAuthority> trong đối tượng Authentication/UserDetailsImpl không? Trong ứng dụng của tôi, tôi có hai lớp bảo mật, một lớp để đăng nhập (sử dụng trình xác thực đăng nhập tùy chỉnh của tôi, trong lớp tôi đặt đối tượng Authentication sử dụng UsernamePasswordAuthenticationToken) và một cho "câu hỏi thách thức" nơi người dùng được nhắc trả lời một câu hỏi cụ thể.Bảo mật mùa xuân: Đặt GrantedAuthorities

Điều tôi muốn làm là thêm GrantedAuthority vào List<GrantedAuthority> hiện tại, được tạo trong quá trình đăng nhập, sau khi người dùng trả lời câu hỏi thách thức.

Điều này có khả thi không?

+0

Một điều cần làm rõ về vấn đề này là những gì lớp thực hiện UserDetails là. Spring không cung cấp lớp gọi là UserDetailsImpl. JdbcDaoImpl tạo ra một cá thể của lớp User, trong khi phiên bản LDAP tạo ra một cá thể của LdapUserDetailsImpl. Vì vậy, nó thực sự phụ thuộc nhiều vào loại đối tượng bạn đang nhận được trở lại cho dù bạn có thể thay đổi chính quyền. Tôi chưa bao giờ thực sự sử dụng một trong những triển khai UserDetails do Spring cung cấp một cách chính xác vì những thứ như các bộ bất biến cho các cơ quan có thẩm quyền, đó là một thứ có thể thay đổi. –

Trả lời

8

bạn có thể làm điều đó với đoạn mã sau:

Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ANOTHER"); 
List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>(); 
updatedAuthorities.add(authority); 
updatedAuthorities.addAll(oldAuthorities); 

SecurityContextHolder.getContext().setAuthentication(
     new UsernamePasswordAuthenticationToken(
       SecurityContextHolder.getContext().getAuthentication().getPrincipal(), 
       SecurityContextHolder.getContext().getAuthentication().getCredentials(), 
       updatedAuthorities) 
); 
0

Phương thức UserDetails.getAuthorities() chỉ trả về đối tượng Collection<GrantedAuthority>. Bạn có thể sử dụng phương thức Collection thích hợp để thêm quyền hạn mới của bạn vào bộ sưu tập đó.

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
if (principal instanceof UserDetails) { 
    ((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO")); 
} 

Selah.

+1

Không thể thêm vào bộ sưu tập -> UnmodifiableCollection – Slavak

+0

@Slavak Điều đó thực sự sẽ phụ thuộc vào việc triển khai bạn đang sử dụng cho UserDetails. Chúng tôi không sử dụng lớp Người dùng từ org.springframework.security.core.userdetails trong triển khai của chúng tôi. Rõ ràng nếu bạn cần thiết lập hoặc sửa đổi các cơ quan chức năng, bằng cách thực hiện một bộ sưu tập là không thay đổi và không có phương thức setAuthorities() (không được hứa hẹn trên giao diện UserDetails) có nghĩa là câu trả lời cho câu hỏi là không. Không, điều đó là không thể. Nếu không, bạn phải cung cấp triển khai UserDetails của chính mình, đó là những ứng dụng linh hoạt nhất cần làm. –

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