2010-08-13 52 views
19

Tôi đang trong quá trình xây dựng hệ thống kiểm soát truy cập như là một phần của khung công tác web mà tôi đang phát triển. Tôi muốn làm cho nó trở nên siêu linh hoạt và tuyệt vời. Bạn có thể giúp tôi bằng cách cung cấp đầu vào và thông tin chi tiết về thiết kế của tôi không? Đây là công việc của tôi cho đến nay (câu hỏi cụ thể của tôi là ở phía dưới):Xây dựng Hệ thống Kiểm soát Truy cập Tốt hơn

Người dùng

  • Người dùng có một tên người dùng (32 ký tự, không có khoảng trắng) và mật khẩu
  • Người dùng đã một hoặc nhiều địa chỉ e-mail mà phải được xác nhận
  • người dùng có thể đăng nhập bằng cách sử dụng tên đăng nhập hoặc bất kỳ địa chỉ e-mail của họ
  • người dùng có thể liên quan đến số không hoặc nhiều tài khoản
  • của họ

Accounts

  • Accounts đại diện cho một hoặc nhiều người dùng hơn
  • Mỗi người dùng có thể có quyền cụ thể hoặc vai trò một tài khoản (ví dụ, chủ sở hữu tài khoản hoặc "có thể thêm người dùng mới")
  • Tất cả tài khoản được liên kết với một loại tài khoản

Loại tài khoản

  • loại tài khoản không có hay có nhiều vai trò loại tài khoản
  • loại tài khoản không có hay có nhiều loại tài khoản tính năng

Loại tài khoản Vai trò

  • Ví dụ, "Chủ đầu tư", "Quản trị viên", "Người dùng điện", "Khách", v.v.
  • Vai trò loại tài khoản là tập hợp các quyền loại tài khoản

Loại tài khoản Quyền

  • Loại tài khoản cho phép những hành động cụ thể trong hệ thống mà ứng dụng logic sẽ xác minh chống lại
  • Họ có thể tham khảo một phụ huynh, để họ có thể được nhóm theo thứ bậc
  • Ví dụ:
    • "Quản lý người dùng"
      • "Add User"
      • "Xóa người dùng"
  • Những điều khoản có thể đặc biệt cho một loại tài khoản tính năng

Đặc điểm loại tài khoản

  • tính năng Loại tài khoản chưa được kích hoạt trên một tài khoản để cho nó thêm quyền
  • Ví dụ, "Tài khoản Tiêu chuẩn" hoặc "Premium Account"
  • Những tính năng này, nếu được kích hoạt trên một tài khoản, sẽ cung cấp cho các truy cập tài khoản của chủ sở hữu lớn hơn cho hệ thống
  • họ được theo dõi khi chúng được kích hoạt hoặc ngừng hoạt động và có thể được lập hoá đơn chống lại định kỳ hoặc theo yêu cầu

Quest ions

Cách tốt nhất để kiểm tra logic ứng dụng dựa trên hành động của người dùng là gì? Tôi đã nghĩ đến việc lưu trữ tất cả quyền của người dùng trong đối tượng cho phiên của họ (yêu cầu đăng xuất/đăng nhập để làm mới quyền, mà tôi không phải là người hâm mộ - bất kỳ ý tưởng nào về quản lý quyền trong thời gian thực?):

{ 
    "All Permissions": { 
    "User Management": { 
     "Add User", 
     "Delete User" 
    }, 
    "Premium Account": { 
     "Download Files", 
     "Upload Files" 
    }, 
    } 
} 

Sau đó tôi sẽ khai báo các quyền được yêu cầu cho một hành động cụ thể trong hệ thống. Có thể một cái gì đó như:

Permission::require('Add User'); 

Nếu quyền được khai báo không nằm trong đối tượng quyền người dùng, yêu cầu sẽ không thành công. Tuy nhiên, điều này có vẻ căng thẳng đối với mỗi hành động của người dùng. Ngoài ra, điều gì sẽ xảy ra nếu một tập con khác của quyền có chuỗi "Thêm người dùng"?

Cảm ơn trước vì đã giúp bạn với điều này!

Trả lời

4

Một cách tôi đã thấy rằng tôi thích là một loại quyền "xếp tầng". Bạn có một tập hợp quyền hạn - giả sử đọc, viết, xóa - và những quyền đó có thể được gán cho một nhóm hoặc một người dùng.

READ USER1 
READ USER2 
WRITE USER2 
READ USER3 
WRITE USER3 
DELETE USER3 

Hoặc bạn có thể chỉ định "nhóm" thay vì tên người dùng.

READ SUBSCRIBER 
READ EDITOR 
READ ADMIN 
WRITE EDITOR 
WRITE ADMIN 
DELETE ADMIN 
USER1 SUBSCRIBER 
USER2 EDITOR 
USER3 ADMIN 

Và sau đó bạn có thể chỉ cần sử dụng các giá trị trong bảng để sắp xếp và tìm kiếm bản ghi. Điều này cho phép sự linh hoạt của việc trở thành thành viên của nhiều nhóm có quyền hạn lẫn nhau, v.v.

11

Nhìn vào Quyền loại tài khoản của bạn, có vẻ như bạn có thiết kế hệ thống kiểu kiểm soát truy cập (ACL).

Nếu bạn muốn làm cho nó trở nên siêu linh hoạt và tuyệt vời, thì tôi khuyên đây là không phải là một thiết kế tốt.Công việc của hệ thống ACL cho phép đơn giản - và có thể thực sự là ok trong kịch bản của bạn - nhưng ngay sau khi các quy tắc cấp quyền trở thành ngay cả chút năng động chút - nghĩa là, dựa vào bất kỳ dữ liệu ngữ cảnh nào ngoài danh tính hoặc vai trò của người dùng - ACL rơi phẳng nhanh.

This video đi vào một số chi tiết về các lỗi của ACL và thảo luận các cách thay thế để thực hiện kiểm soát truy cập tài khoản cho các tình huống trong thế giới thực.

Ngoài ra, điều này đã được thực hiện trước đó (mặc dù có ít ngạc nhiên khi thực hiện chúng tôi có thể xem xét); có lẽ có một cái nhìn tại Rhino Security. Liên kết gốc http://ayende.com/Blog/category/548.aspx bị hỏng, vì vậy hãy giữ liên kết lưu trữ internet để tham khảo.

1

Tôi không có bất kỳ lời khuyên cụ thể nào nhưng hai hệ thống tôi quen thuộc có hệ thống truy cập/cấp phép linh hoạt rất tốt là Drupal và Plone. Bạn có thể làm tồi tệ hơn nhiều so với việc sao chép một trong hai cách đó hoạt động. Họ đã có nhiều năm thử nghiệm trong thế giới thực phía sau họ.

3

tôi sẽ có được một cái nhìn tại các hệ thống Java cho phép:

http://download.oracle.com/javase/6/docs/api/java/security/Permission.html

Nó sử dụng "hàm ý logic"; có nghĩa là, đối tượng cấp quyền là điều quyết định liệu hành động đã cho có được phép hay không (tức là quyền truy cập "ngụ ý" quyền truy cập vào tài nguyên) hay không. Tôi cũng sẽ kiểm tra BasicPermission vì nó có một thông số không gian tên khá thẳng về phía trước cho các điều khoản. Trong ví dụ của bạn nó sẽ là (theo danh pháp CRUD)

  • user.create
  • user.delete
  • file.read
  • file.create

trong webapp của chúng tôi, chúng tôi gán quyền cho mỗi tài nguyên hoặc thủ tục có thể được yêu cầu và một tập hợp quyền cho từng người dùng. Sau đó, chúng tôi thực hiện

boolean isAuthorized = user.permissions.implies (yêu cầuResource.permission); (đóng gói tiêu chuẩn ngụ ý)

để xác định xem người dùng có được phép truy cập hay không.

2

Zed Shaw có một số điều thú vị để nói về ACL và những hạn chế của họ. Chắc chắn đáng xem trước khi bạn đi xa hơn nữa trên tuyến đường này.

http://vimeo.com/2723800

+1

Đó là video tôi cũng liên kết trong câu trả lời của tôi –

+0

có rất hạn chế tôi cần thêm điều khiển. –

1

Ngữ nghĩa bạn đang sử dụng hơi khó hiểu. Ví dụ: Loại tài khoản của "Chủ sở hữu", "Quản trị viên", "Người dùng quyền lực", "Khách" có vẻ giống "Loại người dùng" hơn.

Ngoài ra, có lẽ bạn có thể thực hiện những điều bạn đang gọi là "AccountPermissions" là một phân lớp của tài khoản. Bằng cách này tùy thuộc vào loại tài khoản, các quyền khác nhau sẽ được áp dụng.

3

Đây là hai ý nghĩa của tôi, cho những gì nó có giá trị.

Trước tiên tôi sẽ nói, khi bạn bắt đầu thiết kế, hãy nghĩ về OOP và cách nó sẽ áp dụng cho các thực thể trong hệ thống. Người dùng, User_Role, Vai trò, Role_Permissions, Tài khoản, Account_Types, Account_Type_Features, v.v.

NGƯỜI DÙNG: - có nên được phép sử dụng OpenID vì nó là được kéo - Các tùy chọn để chọn giữa một ID hoặc UUID cho cơ sở dữ liệu di

USER VAI TRÒ: (không phải tài khoản VAI TRÒ TYPE) Tôi sẽ khuyến khích bạn rất cụ thể ở đây. Ví dụ: bạn vẽ đường giữa người dùng nguồn và quản trị viên ở đâu? Sự khác nhau giữa ADMIN và OWNER là gì? Miễn là chúng được xác định rõ ràng (và không bị mờ), thì nó sẽ hoạt động. Nếu có bất kỳ câu hỏi nào trong số cơ sở người dùng của bạn, bạn sẽ sớm có một bộ vai trò và quyền hạn phức tạp. Tôi sẽ giữ điều này ở mức tối thiểu để giữ cho mọi thứ sạch sẽ. Người dùng sẽ tìm ra cách làm việc với những gì họ được cung cấp. Ngoài ra, tôi sẽ thay đổi điều này thành USER LOẠI ROLES. Các vai trò nên áp dụng cho người dùng, không áp dụng cho tài khoản.

GIẤY PHÉP ROLL: (không phải loại PERMISSIONS TÀI KHOẢN) Điều này sẽ được thay đổi thành PERMISSIONS ROLE. Các quyền được mở rộng đến vai trò người dùng chứ không phải tài khoản hoặc người dùng. Theo kinh nghiệm của tôi thì thiết kế càng rõ ràng, càng ít chỗ nhầm lẫn trên đường. Ngoài ra, tránh ACL như bệnh dịch hạch. Làm cho nó trở thành một mối quan hệ một-một. Tôi vẫn chưa tìm được lý do để triển khai ACL cho bất kỳ hệ thống dựa trên web nào. Các hệ thống dựa trên sự cho phép khác dễ hiểu hơn, duy trì và sử dụng. Không có ý nghĩa trong việc làm phức tạp vấn đề.

TÍNH NĂNG LOẠI TÀI KHOẢN: Cẩn thận để không che khuất loại quyền tài khoản và tính năng loại tài khoản. Điểm bullet đầu tiên của bạn sử dụng quyền từ. Thay đổi nó thành các tính năng. Loại tài khoản sẽ kích hoạt các tính năng nâng cao/cao cấp hơn (không cho phép).

Quản lý quyền: Đối với ứng dụng không có trạng thái chạy trên web, phiên là cách để thực hiện. Lợi thế là không có vòng để DB liên tục kiểm tra xem người dùng có được ủy quyền hay không.

Permission::require() phải tuân theo cùng định nghĩa tham số như Phiên mặc dù. Điều này sẽ ngăn chặn sự chồng chéo của các tập hợp con quyền khác. Vì vậy, các cuộc gọi sẽ là một cái gì đó như Permission::require('User Management', 'Add User'); Điều này có nghĩa là nó sẽ tìm kiếm $_SESSION['All Permissions']['User Management']['Add User'] Điều này sẽ ngăn ngừa sự mơ hồ.

Hãy nhớ rằng SIMPLE là TỐT HƠN.

2

Tôi khuyên bạn nên xem xét Zend_Acl từ khung công tác Zend. Giống như hầu hết các gói Zend, nó có một đường cong học tập dốc. Nhưng khi bạn nắm bắt đầy đủ các nguồn lực, hành động, mối quan hệ vai trò nó sẽ trở thành một nền tảng linh hoạt và mạnh mẽ verry cho việc triển khai ACL của riêng bạn.

Thực hiện một số nghiên cứu về các gói và mẫu ACL hiện có.

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