2008-12-02 43 views
35

Tôi cần thêm vai trò người dùng và hệ thống quyền vào ứng dụng web của mình được tạo bằng PHP/MySQL. Tôi muốn có chức năng này:Thực tiễn tốt nhất để thiết kế vai trò người dùng và hệ thống quyền?

  1. Một người dùng root có thể tạo thư mục con, nhóm, quy tắc và người dùng bình thường (tất cả các đặc quyền).
  2. Gốc con chỉ có thể tạo quy tắc, quyền và người dùng cho nhóm của riêng họ (không có nhóm).
  3. Người dùng có thể truy cập vào nội dung do anh hoặc nhóm của anh tạo ra, dựa trên sự cho phép được gán cho anh ta, theo gốc nhóm.

Tôi cần hệ thống đủ linh hoạt để vai trò và quyền mới được gán cho nội dung.

Tôi có users bảng lưu trữ khóa nhóm cùng với thông tin khác. Hiện tại, tôi đang sử dụng hai feild trong mỗi bảng nội dung, tức là createdByCreatedByGroup và sử dụng điều đó làm điểm cho dù người dùng nhất định có quyền. Nhưng nó không đủ linh hoạt, bởi vì đối với mỗi nội dung mới, tôi phải đi tất cả các cập nhật dữ liệu và cập nhật quyền. Hãy giúp tôi bằng cách thảo luận về các phương pháp hay nhất của bạn để thiết kế giản đồ.

Trả lời

33

Mẫu phù hợp với nhu cầu của bạn được gọi là role-based access control.

Có một số cách triển khai tốt trong PHP, bao gồm Zend_Acl (tài liệu tốt), phpGACLTinyACL. Hầu hết các khung công tác cũng có cách triển khai ACL của riêng chúng dưới dạng nào đó.

Thậm chí nếu bạn chọn tự cuộn, nó sẽ giúp bạn xem xét các giải pháp được tính toán tốt như các giải pháp đó.

+0

Liên kết Zend_Acl bị hỏng – reformed

+1

http://framework.zend.com/manual/1.12/en/zend.acl.html –

6

Tôi có cấu trúc hơi khác, nhưng nó có thể phục vụ như một tham chiếu.

Mỗi người dùng có một liên kết 'Vai trò', 'NhómID' với nó và bảng Nhóm mà GroupID đề cập đến. Sau đó, tôi có 3 bảng cho phép.

PermissionMaster(FormName) 

PermissionChild(PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn)

PermissionGroupChild(GroupID, PermissionChildID, Allow) 

PermissionMaster giữ tên/form/mô-đun mà sự cho phép đề cập đến. PermissionChild sẽ liệt kê tất cả các quyền có sẵn cho mỗi Master, chẳng hạn như 'Tạo', 'Xem', 'Chỉnh sửa', 'Xoá' và mô tả (Tôi không có điều này trên phiên bản đầu tiên, và nó bắt đầu trở nên khó hiểu khi có quá nhiều quyền thiết lập ngay cả đối với 1 mô-đun). Tôi cho phép thêm nhiều trẻ em đặc biệt tham khảo một số chức năng như 'ChangeTimeStamp', điều này cũng cho phép sự cho phép cụ thể hơn sau đó 'Chỉnh sửa'

Sau đó PermissionGroupChild là liên kết giữa PermissionChild và bảng Nhóm. Mỗi nhóm sẽ có một bộ PermissionChild sao chép và thiết lập với thiết lập mặc định. Sau đó, tôi đã có một lớp quyền mà không truy vấn bảng và kiểm tra cho mỗi người dùng. Tôi chỉ tải nó trong khi đăng nhập. Sau đó, trong mọi hình thức/mô-đun, tôi kiểm tra sự cho phép thích hợp của nó và áp dụng giao diện người dùng đúng cách.

Đối với vai trò, tôi chỉ sử dụng nó ở trang Cấu hình đăng nhập. Giá trị Vai trò nhỏ hơn có nghĩa là xếp hạng cao hơn. Vì vậy, người dùng chỉ có thể thấy chính nó và giá trị Vai trò cao hơn chính nó. Anh ấy/cô ấy có thể chỉnh sửa những người có thứ hạng thấp hơn bản thân nhưng không giống nhau.

+0

Bạn có thể vui lòng giải thích cách bạn đã sử dụng PermissionChild - làm việc trên thứ gì đó và điều này có vẻ thú vị không. Giá trị mặc định được sử dụng như thế nào. 'PermissionChild (PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn)' – rizwaniqbal

+1

Đối với mỗi mẫu tôi có quyền cơ bản cho 'Tạo' (Thêm mục mới),' Xem' (Không có mẫu này bị từ chối truy cập), 'Chỉnh sửa' (Chỉnh sửa các mục nhập hiện có) và 'Xóa' (xóa mục nhập). Đôi khi tôi có thêm 'PermissionChild' như' ChangePassword' (thay đổi mật khẩu của người dùng trong quản lý người dùng) vv. Giá trị mặc định là 'Boolean' để chỉ ra khi không ghi đè, cho dù được cho phép theo mặc định hay không. Biểu mẫu phổ biến nhất sẽ có 'Giá trị mặc định' của 'Xem' = 1' – faulty

6

Bạn có thể không muốn nhóm quyền. Thay vào đó, hãy tạo nhóm người dùng, cấp quyền cho nhóm người dùng và đưa người dùng vào nhóm. Người dùng cũng có thể ghi đè quyền từ các nhóm họ đang ở. Deny phải luôn ghi đè quyền tài trợ khi người dùng ở trong nhiều nhóm với trang web.

Nói tóm lại:

  • Người dùng có số không hay nhiều điều khoản (grany, từ chối)
  • User is trong zero hoặc nhóm hơn
  • Nhóm có số không hay nhiều điều khoản (tài trợ, từ chối)
23

Tôi nghĩ toán tử bitwise là cách tốt nhất để thực hiện quyền của người dùng. Ở đây tôi cho thấy cách chúng ta có thể thực hiện nó với MySQL.

Dưới đây là bảng mẫu với một số dữ liệu mẫu:

Bảng 1: Permission bảng để tên cửa hàng cho phép cùng với nó cắn như 1, 2, 4, 8 .. vv (bội số của 2)

CREATE TABLE IF NOT EXISTS `permission` (
    `bit` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`bit`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Chèn một số dữ liệu mẫu vào bảng.

INSERT INTO `permission` (`bit`, `name`) VALUES 
(1, 'User-Add'), 
(2, 'User-Edit'), 
(4, 'User-Delete'), 
(8, 'User-View'), 
(16, 'Blog-Add'), 
(32, 'Blog-Edit'), 
(64, 'Blog-Delete'), 
(128, 'Blog-View'); 

Bảng 2: bảng tài khoản để lưu trữ sử dụng id, tên và vai trò. Vai trò sẽ được tính là tổng số quyền.
Ví dụ:

Nếu người dùng 'Ketan' có quyền 'Thêm người dùng' (bit = 1) và 'Blog-Delete' (bit-64) thì vai trò sẽ là 65 (1 + 64).
Nếu người dùng 'Mehata' có quyền 'Blog-View' (bit = 128) và 'User-Delete' (bit-4) thì vai trò sẽ là 132 (128 + 4).

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `role` int(11) NOT NULL, 
    `created_date` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

mẫu đĩa dữ liệu

INSERT INTO `user` (`id`, `name`, `role`, `created_date`) 
    VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'), 
    (NULL, 'Mehata', '132', '2013-01-09 00:00:00'); 

loding cho phép của người dùng Sau khi đăng nhập, nếu chúng ta muốn tải cho phép người sử dụng thì chúng ta có thể truy vấn dưới đây để có được các điều khoản:

SELECT permission.bit,permission.name 
    FROM user LEFT JOIN permission ON user.role & permission.bit 
WHERE user.id = 1 

Ở đây người dùng .role "&" permission.bit là một toán tử Bitwise sẽ cung cấp đầu ra là -

User-Add - 1 
Blog-Delete - 64 

Nếu chúng ta muốn kiểm tra thời tiết một người dùng cụ thể có người dùng chỉnh sửa cho phép hay không-

SELECT * FROM `user` 
    WHERE role & (select bit from permission where name='user-edit') 

Output = Không có hàng.

Bạn cũng có thể xem: http://goo.gl/ATnj6j

+0

Giá trị tối đa cho phép cho bảng quyền là gì? Có thể chèn bao nhiêu quyền duy nhất vào bảng quyền? Làm thế nào về việc thêm tổng kết của tất cả các quyền có thể vào cột vai trò người dùng? – traditional

+1

@traditional - kích thước sẽ là sử dụng bigint, 64 bit, cho phép 64 quyền. Nếu đó là đủ, đây là một cách làm việc gọn gàng. Nếu đó là không đủ và bạn không phải lo lắng về không gian, có cột riêng biệt cho mỗi sự cho phép có lẽ sẽ là ok. –

+2

Không có khái niệm về 'vai trò' ở đây - những gì bạn có là danh sách quyền cho mỗi người dùng. –

1

Tôi có các nhóm và người dùng (như giải pháp LDAP thư mục hoạt động). Vì vậy, nếu tôi cấp quyền truy cập cho nhóm, tôi cần người dùng trong nhóm này có quyền truy cập được truy cập.

Vì vậy, căn cứ vào @ suresh-kamrushi câu trả lời dưới đây, tôi thực hiện điều này:

INSERT INTO `permission` (`bit`, `name`) VALUES 
(1, 'add-yes'), 
(2, 'add-no'), 
(4, 'edit-yes'), 
(8, 'edit-no'), 
(16, 'del-yes'), 
(32, 'del-no'), 
(64, 'view-yes'), 
(128, 'view-no'); 

Nếu người dùng có chút 00000000, tôi đi đầu tiên hai chữ số 00 đó có nghĩa là add-yesadd-no được herited từ quyền nhóm.

Nếu người dùng có bit 01010110, tôi lấy hai chữ số đầu tiên 01 có nghĩa là add-no sẽ chính trên quyền của nhóm, vì vậy người dùng này không có quyền thêm. Điều này bitwise nói rằng người dùng chỉ có thể xem.

Nó cũng hoạt động với các nhóm chính.

Bạn nghĩ gì về giải pháp này? Có ai có cách nào tốt hơn cho điều đó không?

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