2010-02-18 34 views
6

tôi sử dụng SecurityContextHolder và một tùy chỉnh để có được UserDetailsServiceUserDetails từ SecurityContextHolder:Có phải SecurityContextChủ đề an toàn không?

Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
UserDetailsDTO user = (UserDetailsDTO) o; 

tôi rời ra kiểm tra null, vv, nhưng đó là ý tưởng. Tôi đang sử dụng này trong một @Around pointcut của một @Aspect:

@Around("execution(* user.service.*.*(..))") 
public Object audit(ProceedingJoinPoint call) throws Throwable { 
    // get user id 
    // add audit row in db 
} 

Nhìn vào lớp SecurityContextHolder, nó sử dụng một ThreadLocal theo mặc định, nhưng những thứ pointcut cũng dường như có một số loại của logic luồng đóng gói.

Có thể có thể xảy ra xung đột người dùng (tức là truy cập UserA từ một phiên cho sự kiện kiểm toán UserB trong một phiên đồng thời khác) hoặc có thể là người dùng rỗng hoàn toàn.

Có cách nào tốt hơn để lấy thông tin xác thực/hồ sơ người dùng không?

Trả lời

5

Có, đó là chủ đề an toàn với chiến lược mặc định (MODE_THREADLOCAL) (miễn là bạn không cố gắng thay đổi chiến lược khi đang di chuyển). Tuy nhiên, nếu bạn muốn các luồng sinh ra kế thừa SecurityContext của chuỗi gốc, bạn nên đặt MODE_INHERITABLETHREADLOCAL.

Ngoài ra các khía cạnh không có bất kỳ "luồng logic" nào, chúng được thực hiện tại cùng một luồng với phương thức được đề xuất.

+0

Tôi thấy điều đó, nhưng con người làm điều đó có vẻ giống như một miscue khổng lồ cho các chàng trai mùa xuân. Một lớp util tĩnh, và setStrategyName có sự xáo trộn Javadoc này: 'KHÔNG gọi phương thức này nhiều hơn một lần cho một JVM đã cho, vì nó sẽ khởi tạo lại chiến lược và ảnh hưởng xấu đến bất kỳ chủ đề hiện có nào bằng chiến lược cũ. cuối cùng tạo ra một lớp wrapper singleton. – Droo

+0

Tôi đoán rằng đó cũng là thuộc tính hệ thống: 'chuỗi cuối cùng tĩnh công cộng SYSTEM_PROPERTY =" spring.security.strategy ";' – Droo

-1

Có chủ đề an toàn. Bạn chỉ nên gọi số SecurityContextHolder.getContext(). GetAuthentication(). GetName()

+0

Lý do cho downvote vui lòng – vsingh

1

nói chung, ThreadLocal sẽ không thân thiện trong nhóm chủ đề được lưu trong bộ nhớ cache toàn cầu. Một thư mục mặc định được lưu trong bộ đệm của ExecutorService (Executors.newCachedThreadPool()) sẽ có hoặc là khởi tạo luồng ThreadLocal của luồng, hoặc một kho trống. Trong tình huống này, thiết lập MODE_INHERITABLETHREADLOCAL sẽ không thay đổi bất cứ điều gì, trừ khi các threaded cache được khởi tạo cho mỗi yêu cầu, mà sẽ là một cách sử dụng khá xấu của nó .. Hãy chắc chắn rằng bất kỳ khuôn khổ hoặc thư viện cơ bản không sử dụng Executors.newCachedThreadPool() để cung cấp thread tổng hợp cho bạn.

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