2013-08-15 24 views
7

Trong ứng dụng MVC mùa xuân của tôi, tôi muốn truy cập Principal đối tượng được tạo ra bởi bảo mật mùa xuân trong lớp dịch vụ của tôi. Tôi nghĩ về việc tiêm nó vào các lớp dịch vụ của tôi, nhưng tôi chắc chắn nó sẽ không được an toàn. Tùy chọn khác tôi đang suy nghĩ, là chuyển nó cho tất cả các phương pháp dịch vụ như là đối số nhưng điều này không trông rất sạch sẽ với tôi. Cách tốt nhất để làm điều này là gì?Lấy đối tượng người dùng chính trong các phương thức dịch vụ

Trả lời

10

Tôi nghĩ rằng cách tiếp cận tốt nhất sẽ là sử dụng SecurityContextHolder.

Principal principal = SecurityContextHolder.getContext().getAuthentication(); 

Xuân giải thích cách nó hoạt động trong documentation:

Đối tượng cơ bản nhất là SecurityContextHolder. Đây là nơi chúng tôi lưu trữ chi tiết về bối cảnh bảo mật hiện tại của ứng dụng, bao gồm chi tiết về hiệu trưởng hiện đang sử dụng ứng dụng . Theo mặc định, SecurityContextHolder sử dụng một ThreadLocal để lưu trữ các chi tiết này, có nghĩa là ngữ cảnh bảo mật là luôn sẵn có cho các phương thức trong cùng một luồng thực thi, ngay cả khi ngữ cảnh bảo mật không được chuyển một cách rõ ràng như một đối số cho các phương thức đó . Sử dụng ThreadLocal theo cách này là khá an toàn nếu việc chăm sóc được thực hiện để xóa chỉ sau khi yêu cầu của hiệu trưởng hiện tại là được xử lý. Tất nhiên, Spring Security tự lo việc này cho bạn một cách tự động để không cần phải lo lắng về điều đó.

Vì nó sử dụng ThreadLocal để lưu trữ xác thực hiện tại, bạn sẽ không gặp bất kỳ vấn đề an toàn chủ đề nào.