2012-04-26 24 views
5

Tôi có một phương pháp bảo đảm bằng @PreAuthorizeBảo mật mùa xuân: Cách đúng để gọi phương thức được bảo mật bằng @PreAuthorize trong tác vụ nền là gì?

@PreAuthorize("hasRole('ROLE_ADMIN') and (#action.userId != principal.id)") 
public void execute(EditAction action) 

Bây giờ tôi cần phải gọi phương pháp này từ một công việc nền. Nếu tôi chỉ cần chạy mã này - Tôi bắt một ngoại lệ:

AuthenticationCredentialsNotFoundException: Một đối tượng xác thực không được tìm thấy trong SecurityContext

những vẻ, tôi cần phải thiết lập bất cứ xác thực để SecurityContext. Tôi có thể:

  1. Viết một số tùy chỉnh AuthenticationToken cho tác vụ nền.
  2. Sử dụng Tên người dùngPasswordThử nghiệmTạo với Người dùng giả mạo.
  3. Không sử dụng các phương thức bảo mật trong các tác vụ nền.
  4. Còn gì nữa không?

Cách phù hợp là gì?

+0

bạn có thể vui lòng hiển thị một số mã không? Bạn gọi nó như thế nào? –

+0

Đây không phải là cuộc gọi trong suốt - chúng tôi đang sử dụng mẫu lệnh. Phương thức bảo mật là một phương thức xử lý. Bằng "tác vụ nền", tôi có nghĩa là một MessageList jms hoặc một số phương pháp @Scheduled. Tôi đang gọi phương thức bảo mật một cách nào đó, như tôi gọi nó bằng cách xử lý servlet - bằng cách gửi một Action. – Popandopolos

Trả lời

2

Bạn có thể đăng ký một xác thực mã thông báo trong các chủ đề hiện tại và phiên (nếu sử dụng trong một ứng dụng web):

SecurityContextHolder.getContext().setAuthentication(token); 
session.put(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); 

Bạn có thể sử dụng UsernamePasswordAuthenticationToken tiêu chuẩn cho điều này chừng nào bạn thêm vai trò thích hợp.

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