7

Tôi là thành viên của nhóm tạo ứng dụng web sử dụng PHP và MySQL. Ứng dụng sẽ có nhiều người dùng với các vai trò khác nhau. Ứng dụng cũng sẽ được sử dụng theo cách phân phối theo địa lý. Theo đó chúng ta cần phải tạo ra một hệ thống kiểm soát truy cập mà hoạt động ở hai cấp độ sau:Hệ thống kiểm soát truy cập PHP

  1. quyền điều khiển người dùng cho trang php cụ thể ví dụ: cung cấp hoặc từ chối truy cập đến các trang cụ (hoặc các yếu tố giao diện người dùng) dựa trên vai trò của người dùng. Ví dụ: người dùng có thể được phép truy cập trang "Sinh viên" nhưng không được phép truy cập trang "Giáo viên".
  2. Kiểm soát quyền của người dùng đối với các bản ghi cơ sở dữ liệu cụ thể tức là sửa đổi truy vấn cơ sở dữ liệu để chỉ các bản ghi cụ thể được hiển thị. Ví dụ, đối với người dùng ở cấp thành phố, chỉ những bản ghi được hiển thị có liên quan đến thành phố cụ thể của người dùng, trong khi đối với người dùng ở cấp quốc gia, các bản ghi cho TẤT CẢ CITIES ở quốc gia sẽ được hiển thị.

Tôi cần trợ giúp thiết kế hệ thống có thể xử lý cả hai loại kiểm soát truy cập này. Điểm không. 1 dường như đủ đơn giản. Tuy nhiên, tôi hoàn toàn thua lỗ về cách làm điểm số 2 mà không cần mã hóa thông tin trong các truy vấn SQL.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn trước

Vinayak

Trả lời

12

Tôi đã ở trong tình huống tương tự vài tháng trước. Tôi thấy rằng các công cụ như Zend_ACL hoạt động tốt nếu bạn chỉ kiểm tra cấp độ truy cập vào một mục duy nhất (hoặc số lượng tương đối thấp của chúng). Nó không thành công khi bạn cần để có được một danh sách lớn các mục mà người dùng được phép truy cập. Tôi đã tạo giải pháp tùy chỉnh cho vấn đề này bằng cách sử dụng mẫu Business Delegate. BD cung cấp logic nghiệp vụ có thể được áp dụng trong ngữ cảnh cụ thể.Trong trường hợp này, một logic SQL được phân phối và được sử dụng làm điều kiện lọc trong subselect. Xem sơ đồ sau:

alt text http://gruz.epsi.pl/g/uml/permissions.png

Và chuỗi sơ đồ minh họa các cuộc gọi đặt hàng:

alt text http://gruz.epsi.pl/g/uml/permissions-s2.png

I blogged about this solution, không may đó là tất cả bằng tiếng Ba Lan, nhưng bạn có thể tìm thấy mẩu mã và sơ đồ tiện dụng. Những gì tôi có thể nói, việc thực hiện không phải là một miếng bánh, nhưng hiệu suất-khôn ngoan nó là một nhà vô địch khi so sánh với kiểm tra truy cập lặp đi lặp lại cho mỗi yếu tố trong danh sách. Hơn nữa, cơ sở hạ tầng trên không chỉ xử lý một loại mục trong danh sách. Nó có thể phục vụ khi truy cập vào các danh sách khác nhau, có thể là danh sách các thành phố, quốc gia, sản phẩm hoặc tài liệu miễn là các mục trong danh sách thực hiện giao diện IAuthorizable.

+0

Xin chào, tôi biết câu trả lời cũ của nó, nhưng tôi chỉ cần một số làm rõ về [sơ đồ lớp UML] (http://en.wikipedia.org/wiki/Class_diagram), các loại mũi tên khác nhau có ý nghĩa gì ?, (rắn, rạng ngời và có màu xám) – Triztian

+1

@Triztian - Những chữ cái rắn có mũi tên là các cuộc gọi phương thức, các đường thẳng đứng bị gạch ngang biểu thị các đường dây sống và các đường ngang bị gạch ngang thường biểu thị sự trở lại –

1

Không biết về các chi tiết của vấn đề của bạn, nhưng Zend Framework có khá mạnh ACLAUTH tập các thành phần bạn có thể muốn xem xét. Các công cụ tốt như kiểm soát truy cập rất chính xác, lưu trữ dữ liệu để duy trì, các quy tắc có điều kiện nâng cao.

1

Dường như với tôi như những gì bạn cần là thế này: (Tôi sẽ sử dụng một/tiểu bang/example thành phố nước)

  1. Một danh sách của tất cả các quốc gia. Mỗi "quốc gia" có một ID.
  2. Danh sách tất cả các quốc gia trong quốc gia. Mỗi trạng thái được gắn với ID của coutnry, nhưng cũng có ID duy nhất của riêng nó.
  3. Danh sách tất cả các thành phố. Mỗi thành phố bị ràng buộc với một tiểu bang, hoặc trực tiếp đến một quốc gia, và có một lá cờ để cho biết.

Đối với người dùng thành phố, rõ ràng là tìm kiếm và chỉ hiển thị những hồ sơ liên quan đến thành phố khớp với ID của họ. Đối với cấp tiểu bang hoặc cấp quốc gia, hãy tìm kiếm tất cả hồ sơ liên quan đến từng thành phố có ID phù hợp với quốc gia đó (hoặc tiểu bang hoặc bạn có). Vì vậy, về cơ bản, mỗi nhóm phụ phụ thuộc vào nhóm ở trên nó, và mặc dù tôi không nhớ chính xác, tôi tin rằng bạn có thể sử dụng các truy vấn phụ để làm thủ thuật từ đó.

+0

Xin chào Nhưng điều này có nghĩa là các truy vấn tìm kiếm phải được viết khác nhau cho từng cấp người dùng. Vấn đề của tôi là tìm cách để làm cho cùng một truy vấn trả về các tập hợp kết quả khác nhau dựa trên cấp độ của người dùng. – Vinayak

+0

@ vinayak.myopenid.com, Bạn sẽ phải sử dụng truy vấn khác nếu bạn để máy chủ SQL biết mức truy cập bạn có. Có vẻ như các điều khoản sẽ được xử lý bằng cách tacking biểu thức trong mệnh đề WHERE với AND. Âm thanh khá đơn giản. – strager

0

Nếu bạn không biết cách thực hiện việc này, tôi sẽ sử dụng một khung công tác php như Zend Framework, CakePHP hoặc Symphony. Họ đã thực hiện việc nâng hạng nặng cho bạn và có một số loại lược đồ kiểm soát truy cập đã có sẵn.

0

Tôi có giải pháp tương tự để xây dựng và cho đến nay tôi đã quyết định sử dụng các đặc tả và vai trò, vì vậy trên thực tế, một vai trò sẽ có một số đặc điểm đặc quyền được đính kèm. Nếu tất cả đều hài lòng, quyền được cấp, nếu không - nó sẽ trở lại quyền truy cập mặc định tài nguyên.

Tôi đã tìm kiếm để tìm người nào đó đã triển khai giải pháp, nhưng có vẻ như không ai làm được. Hãy hy vọng nó sẽ không thất bại :)