2010-07-09 58 views
14

Tôi đang tạo trang web mà tôi sẽ quản lý người dùng và quyền của họ. Tôi đang tìm cách để thực hiện vai trò người dùng, và dường như không thể che giấu đầu của tôi xung quanh cách mọi thứ sẽ hoạt động. Tôi muốn có thể gán cho người dùng một vai trò nhất định và mỗi vai trò có một vai trò với một số quyền có thể được đọc dễ dàng bởi tập lệnh của tôi. Chỉ muốn biết làm thế nào tôi nên đi về việc thiết lập cơ sở dữ liệu của tôi để làm điều này một cách dễ dàng và hiệu quả.Làm cách nào để quản lý Vai trò Người dùng trong Cơ sở dữ liệu?

Trong đầu, tôi hình 3 bảng (người dùng, vai trò và quyền). Tôi có thể cung cấp cho mỗi người dùng một id vai trò tham gia bảng vai trò, tôi chỉ không biết cách tôi có thể liên kết vai trò với một số quyền.

Trả lời

35

Tôi chỉ không biết cách liên kết vai trò với một số quyền.

Bạn sử dụng một bảng tham gia: ROLE_ID và permission_id để xác định những điều khoản có liên quan đến role

EDIT:

Ví dụ bảng

VAI TRÒ Bảng

Role_ID Role_Name 
1  Standard User 
2  Super User 
3  Guest 

PERM Ission Bảng

Permission_ID Permission_Name 
1    View User List 
2    Update Own User Account 
3    Update Any User Account 

ROLE_PERMISSION Bảng

Role_ID Permission_ID 
1  1 // Role 1 (Standard User) grants View User List 
1  2 //  and Update Own User Account 
2  1 // Role 2 (Super User) grants View User List, 
2  2 //  Update Own User Account, 
2  3 //  and Update Any User Account 
3  1 // Role 3 (Guest) grants View User List 

Bảng liệt kê các điều khoản cho một quy định ROLE_ID

select R.role_id, 
     P.permission_id, 
     P.permission_name 
    from role R, 
     permission P, 
     role_permission RP 
where RP.permission_id = P.permission_id 
    and RP.role_id = R.role_id 
    and R.role_id = 1 
+0

Tuyệt vời. Cảm ơn các bạn rất nhiều. –

+8

+1 Ví dụ tuyệt vời. Tôi nghĩ rằng bài đăng này sẽ được tham chiếu bởi nhiều người dùng đang tìm kiếm loại thông tin này. –

+0

Cảm ơn @Mark, trợ giúp tuyệt vời. Bây giờ, nói rằng tôi có một vai trò thiết kế đồ họa và anh ta không có quyền xem hồ sơ anyones nhưng của riêng mình. Tôi đã chỉ định cho anh ta một người dùng để chăm sóc và anh ấy cần quyền truy cập vào hồ sơ của người dùng. Làm thế nào tôi có thể lưu trữ trong Cơ sở dữ liệu mà anh ta có quyền xem bất kỳ hồ sơ nào mà anh ta đã được chỉ định? –

0

Nếu bạn muốn đi theo con đường của 3 bảng, bạn có thể tạo các bảng của bạn như vậy:

Table  | Rows 
User  | id ; name ; dob ; permission_id ; etc... 
Roles  | id ; add_post ; edit_post ; delete_post ; add_user ; etc... 
Permissions | id ; user_id ; role_id 
4

Đây là cách tôi thường làm những gì tôi làm:

Bạn xác định một nhóm quyền có ý nghĩa khác nhau từ đối tượng đích đến đối tượng đích, nhưng có ý nghĩa chung là như nhau. Ví dụ:

  • đọc
  • ghi
  • append
  • xóa
  • xóa nội dung
  • quyền đọc
  • quyền thay đổi

Sau đó bạn gán một chút để mỗi của những người:

class Perms { 
    const read   = 1; 
    const write   = 2; 
    const append   = 4; 
    const delete   = 8; 
    const deleteContents = 16; 
    const readPerm  = 32; 
    const changePerm  = 64; 
    /* shortcuts */ 
    const fullControl = 127; 
    const noControl  = 0; 
} 

Sau đó, đối với từng loại đối tượng bạn có một bảng nơi bạn chèn cặp (user, perms), (group, perms), (role, perms) hoặc bất cứ điều gì bạn muốn kết hợp với các điều khoản.

Bạn có thể truy vấn các điều khoản của người sử dụng (có thể có nhiều vai trò) như thế này:

//this will depend on the database 
//you could also use whatever bitwise OR aggregate your database has 
//to avoid the foreach loop below 
$query = new Query(
    "select perm from objects_permissions as P ". 
    "where P.id_object = \$1 and " . 
    " (P.role = any(\$2));", 
    $obj->getId(), $user->getRoles() 
); 

$perms = 0; 
foreach ($query as $row) { 
    $perms |= $row['perm']; 
} 

Bạn cũng có thể thêm từ chối quyền với ít khó khăn.

+0

Tôi sẽ thú nhận sử dụng một cơ chế tương tự để xác định quyền truy cập của người dùng vào các đối tượng trong một ứng dụng; nhưng cơ chế người dùng/vai trò/quyền tương tự với yêu cầu của OP để truy cập vào chức năng giao diện người dùng chung (ví dụ: quyền UPLOAD_FILE) –

+1

@Mark Cách tiếp cận của tôi là tổng quát. Nếu tôi cần kiểm soát quyền truy cập vào tệp tải lên, tôi xác định "vùng chứa tệp được tải lên" và cấp quyền cho người dùng 'chắp thêm quyền truy cập' trong đối tượng đó. Sau đó, bạn có thể dễ dàng thêm các quyền liên quan khác, ví dụ 'deleteContents' trên vùng chứa đó có thể cho phép xóa các tệp đã tải lên,' read' sẽ cho phép tải xuống tệp hoặc liệt kê chúng, v.v. – Artefacto

4

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..etc (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 hơn 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

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