2013-02-12 31 views
11
  1. Lợi ích để lấy mã số chính là một tham số Principal principal trong bộ điều khiển lò xo và sau đó chuyển nó tới lớp dịch vụ trên lớp dịch vụ ngay lập tức mặc dù SecurityContextHolder.getContext().getAuthentication().getPrincipal()?
  2. Cách tiếp cận tốt nhất để có được các chi tiết chính trong lớp dịch vụ mà không cần kiểm tra getAuthentication()getPrincipal() đối tượng cho null ở khắp mọi nơi (một cái gì đó giống như trình bao bọc tùy chỉnh)?
+1

Bạn có thể tìm thấy câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-the-proper-way-to-obtain- current-username-i) hữu ích. [Câu trả lời này] (http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8765597#8765597) cũng có thể hữu ích. –

+0

Có một giải pháp tốt để có lớp trừu tượng với phương thức tĩnh, nơi tôi có thể đặt 'SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal()'? Sau đó tôi có thể sử dụng nó trong lớp dịch vụ. – Alex

+0

Đọc liên kết thứ hai tôi đã cung cấp cho bạn một lần nữa. Không có gì ngăn bạn sử dụng cách tiếp cận đó trong các dịch vụ của bạn và nếu bạn sử dụng một giao diện, bạn cũng có thể trao đổi nó để thử nghiệm. –

Trả lời

9
    • API dịch vụ của bạn sẽ dễ dàng hơn để sử dụng. Bạn sẽ thấy sự phụ thuộc vào hiệu trưởng trực tiếp, vì vậy bạn không thể gọi một số phương thức dịch vụ do nhầm lẫn trong môi trường mà hiệu trưởng không tồn tại.
    • Nói chung, ít phụ thuộc hơn vào mã SpringSecurity có nghĩa là ít sự cố trong trường hợp di chuyển sang phiên bản Spring Security mới.
    • Bạn sẽ có thể sử dụng lại lớp dịch vụ của mình trong môi trường mà Spring Security không tồn tại.
  1. Chuẩn bị một số lớp trình bao bọc (ví dụ: AuthenticationService). Thêm phương thức getPrincipal() vào nó. Thực hiện kiểm tra của bạn. Tiêm AuthenticationService ở khắp mọi nơi được insted của các cuộc gọi trực tiếp đến SecurityContextHolder.
+0

Nếu tôi cần lấy một số dữ liệu cho người dùng cụ thể, tôi nghĩ việc nhận được hiệu trưởng (tên người dùng) trong lớp dịch vụ an toàn hơn vì có ít lớp giữa (hạn chế) và cơ sở dữ liệu. Vì vậy, đó là dao duy nhất còn lại như trái ngược với nhận được hiệu trưởng trong bộ điều khiển (lớp dịch vụ bổ sung giữa). Nhưng mặt khác, như bạn đã nói, lớp dịch vụ có thể tái sử dụng nhiều hơn. Bạn nghĩ gì về điều này? – Alex

+1

Một đối tượng chính được giữ và giữ bởi lớp web. Vì vậy, đối với tôi có vẻ tự nhiên rằng một hiệu trưởng đến từ contoller đến lớp dịch vụ. Một điểm khác là phụ thuộc tĩnh là xấu đối với thử nghiệm đơn vị: http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/. Tôi không thấy bất kỳ vấn đề bảo mật nào vì một cá thể pincipal là không thay đổi (và thông thường mật khẩu sẽ được xác định từ thực hiện thực tế tại thời điểm này). Xin lỗi vì đã trì hoãn. Tôi đã AFK thời gian dài. –

+0

Có an toàn khi sử dụng tùy chọn 2 của bạn trong BaseService mở rộng (trong lớp dịch vụ) không? – Alex

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