2014-04-15 27 views
6

Tôi biết điều này có vẻ là một yêu cầu kỳ lạ, nhưng khi khách hàng muốn nó có nghĩa là chúng tôi không có lựa chọn nào khác. Tôi đang làm việc trên một ứng dụng web (Thương mại điện tử), và cần phải đăng ký một khách hàng mới, cho đến bây giờ mọi thứ đang hoạt động hoàn hảo. Tuy nhiên có yêu cầu với trường hợp sau đâyChỉ đọc quyền truy cập vào một số khách hàng đã đăng nhập | Spring-MVC

  1. Nếu đăng ký của khách hàng với một số email id họ sẽ được chấp thuận ngay lập tức và sẽ được phép duyệt, xem tất cả mọi thứ và sẽ được phép thực hiện bất kỳ giao dịch.
  2. Đối với các nhóm khách hàng khác, họ được phép đăng nhập nhưng họ chỉ đọc quyền truy cập vào phần hồ sơ đó cũng không thể thấy giá (giảm giá) cho sản phẩm cũng như không được phép thực hiện bất kỳ giao dịch nào.

Vì các trường hợp sử dụng này không áp dụng cho một danh mục nhất định, nhưng đối với toàn bộ ứng dụng web, tôi không chắc cách tốt nhất để đạt được điều này. Một vài tùy chọn đến với tâm trí của tôi

  1. Thêm vai trò mới dưới bảo mật mùa xuân và cho những người có quyền truy cập chỉ đọc mới có vai trò mới này.
  2. tạo một số loại HandlerInterceptor sẽ kiểm tra vai trò của khách hàng trước khi thực hiện yêu cầu thực tế.

Nhưng không chắc chắn nếu tôi đang nghĩ đến trong đúng hướng và cách chính xác chúng ta nên thực thi chỉ đọc truy cập vào loại như vậy của customers.Since Chúng ta phải ngăn chặn khách hàng như vậy từ

  1. Cập nhật/profile của mình
  2. Cập nhật mật khẩu.
  3. Bất kỳ updation khác trong đó hồ sơ
  4. Không cho phép khách hàng để kiểm tra
  5. giá chiết khấu thực tế không nên được nhìn thấy

Trả lời

3

Cách tiếp cận tốt nhất là sử dụng cơ chế kiểm soát truy cập dựa trên vai trò đơn giản (RBAC). Điều này được hỗ trợ tốt bởi Spring Security và dễ sử dụng.

Bạn nên tạo một vai trò mới (ví dụ: "FULL_ACCESS") và chỉ định vai trò đó cho đúng người dùng dựa trên địa chỉ email của họ. Vai trò phải bao gồm người dùng có toàn quyền truy cập, chứ không phải những người có quyền chỉ đọc như câu hỏi của bạn được đề xuất.

Bạn thường xác định vai trò cho người dùng hiện tại trong việc triển khai UserDetailsService. Bạn có thể sử dụng org.springframework.security.core.authority.SimpleGrantedAuthority như việc thực hiện GrantedAuthority của bạn (trong ngữ cảnh của bạn GrantedAuthority cũng giống như Role). Các GrantedAuthorities được trả về từ UserDetailsService của bạn được lưu trữ bên trong đối tượng Authentication của người dùng của bạn và có sẵn trong suốt thời hạn phiên của người dùng. Phương pháp này cũng cho phép bạn dễ dàng thay đổi người dùng từ chế độ chỉ đọc sang chế độ toàn màn hình (ví dụ: sau khi phê duyệt đăng ký), bằng cách thêm vai trò "FULL_ACCESS" trong lần đăng nhập tiếp theo của người dùng sau khi được phê duyệt.

Khi bạn đã điền các tài khoản GrantedAuthorities của mình, bạn có thể sử dụng cả hai phương tiện ủy quyền và có lập trình. Cho phép chương trình (uỷ quyền thực hiện trực tiếp trong mã của bạn) sử dụng ví dụ .:

if (request.isUserInRole("FULL_ACCESS")) { 
     // Only for users with full acccess 
} 

cho phép khai báo (uỷ quyền tuyên bố trong các tập tin cấu hình của bạn hoặc như chú thích để code) bạn có thể sử dụng securing of method calls with aspects or annotations.

Bạn cũng có thể bảo mật các URL an toàn bằng cách sử dụng expression-based access control, nhưng hai phương pháp trước đó phù hợp hơn. Cùng một URL có thể được truy cập bởi người dùng có quyền truy cập đầy đủ và chỉ đọc, điều này làm cho kỹ thuật này khó sử dụng cho trường hợp sử dụng của bạn.

Bảo mật mùa xuân cũng cung cấp một bộ aurhorization JSP tags có thể giúp bạn hiển thị chính xác giao diện người dùng của mình cho các loại người dùng khác nhau.

Bạn có thể sử dụng kết hợp các kỹ thuật ở trên để thực thi tất cả 5 điểm logic kinh doanh được đề cập trong câu hỏi của bạn.

2

Tôi thích spring-security's expression-based access control cho chú thích phương pháp điều khiển với vai trò cho phép, nhưng bạn có thể sử dụng tên lửa đánh chặn url thay vào đó, nếu hành động của bạn có thể dễ dàng phân tách bằng url và/hoặc động từ HTTP. Hoặc là giải pháp sẽ ngăn chặn chúng thực hiện bất kỳ hành động nào mà chúng không nên thực hiện. Sau đó, bạn cũng có thể giới hạn dữ liệu và/hoặc liên kết mà người dùng có thể thấy đơn giản bằng cách chỉ định một chế độ xem khác nếu họ thiếu vai trò nhất định (hoặc bằng cách sử dụng spring security authorize tag trong cùng một chế độ xem).

+0

Thankd for the input .... Tôi biết về ủy quyền thẻ..nhưng tôi phải hiển thị liên kết/phần cho tất cả khách hàng chỉ khách hàng có quyền truy cập chỉ đọc mới có thể đọc. –

2

Tôi muốn tạo vai trò mới và sử dụng spring-security's expression based access control theo đề xuất của @ peter-g.

Nếu thương mại điện tử của bạn là một ứng dụng web truyền thống (các trang được hiển thị trên máy chủ), việc lọc URL không phải là cách tiếp cận tốt nhất. Trong trường hợp này, tôi sẽ kết hợp:

  1. Chú thích cấp phương thức trong lớp dịch vụ. Chỉ chú thích @PreAuthorize được đặt trong lệnh gọi vào đậu sẽ hữu ích. Nếu bạn gọi myService.methodA() và phương thức này sẽ gọi phương thức có chú thích this.methodB() (đây là myService()), chú thích bảo mật sẽ không hoạt động. Họ sẽ chỉ làm việc trên cuộc gọi đầu tiên đến trên myService (trong trường hợp này được đặt trên methodA()). Điều này đóng vai trò như một bức tường lửa bảo mật cho logic nghiệp vụ của bạn.
  2. Liên kết/lọc dữ liệu trên hiển thị trang dựa trên vai trò. Trên các JSP của bạn, lọc ra các nội dung và các liên kết (đó thực sự là các hành động) không tương ứng với các vai trò đang hoạt động hiện tại. Điều này có hai mục đích. Một, để hiển thị nội dung cụ thể cho các vai trò cụ thể. Thứ hai, là rào cản bảo mật đầu tiên để tránh người dùng truy cập vào logic nghiệp vụ của bạn. Bạn thậm chí không cho họ thấy rằng một hành động cụ thể có sẵn cho họ.

Với điều này, người dùng sẽ không bao giờ có thể nhấp vào bất kỳ nút/liên kết nào để truy cập tài nguyên được bảo vệ. Trong trường hợp bạn bỏ lỡ bất kỳ, chú thích lớp dịch vụ sẽ hoạt động như tường lửa cuối cùng bảo vệ thực hiện các hành động đặc quyền. Cũng giống như cách bạn lọc ra siêu dữ liệu/dữ liệu, bạn có thể lọc giá.

Nếu phụ trợ của bạn là một API web, bạn có thể sử dụng lọc URL với chú thích hoặc cấu hình XML/Java và lọc đầu ra bằng cách sử dụng chế độ xem jackson (nếu bạn đang sử dụng JSON) hoặc XSLT nếu sử dụng XML. Nó cho phép kiểm soát hạt mịn hơn và thực hiện bảo mật chặt chẽ hơn.

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