2012-04-25 25 views
6

Tôi đang phát triển một ứng dụng cho công ty của chúng tôi và cuối cùng sẽ có nhiều cách hạn chế người dùng đối với các phần/mô-đun cụ thể. Mặc dù ứng dụng vẫn còn nhỏ, tôi muốn chuyển sang một phương pháp lưu trữ quyền mới, khi ứng dụng phát triển, sẽ vẫn dễ duy trì và truy vấn.Lưu trữ các quyền ứng dụng trong cơ sở dữ liệu

Hiện tại trong cơ sở dữ liệu MySQL của chúng tôi, chúng tôi có một bảng được gọi là "người dùng" lưu trữ ID, tên người dùng và mật khẩu của người dùng. Trong một bảng riêng biệt gọi là "user_acl" như sau:

user_acl_id 
acl_root 
acl_news_read 
acl_news_write 
acl_news_modify 
acl_reports_read 
acl_reports_write 
acl_reports_modify 
acl_users_read 
acl_users_write 
acl_users_modify 

Chúng tôi chỉ có 3 module vào phút, nhưng theo thời gian hơn sẽ được tạo ra và cho phép đối với từng sẽ cần phải được thêm vào.

Thay vì tạo cột cho mỗi quyền, có cách nào khác hoặc lưu trữ thông tin này không?

Trả lời

24

Tôi sẽ làm theo cách này.

table name: permission 
columns: id, permission_name 

và sau đó tôi có thể gán nhiều quyền cho người dùng sử dụng một nhiều để nhiều bảng mối quan hệ

table name: user_permission 
columns: permission_id, user_id 

Thiết kế này sẽ cho phép tôi thêm bao nhiêu phép như tôi muốn, và gán nó là nhiều người dùng như tôi muốn.

Trong khi thiết kế ở trên đi theo yêu cầu của bạn, tôi có phương pháp thực hiện riêng ACL trong ứng dụng của mình. Tôi đăng nó ở đây.

phương pháp của tôi về việc thực hiện các ACL đi như thế này:

  1. Người dùng sẽ được chỉ định một vai trò (Admin, khách, nhân viên, công cộng)
  2. Một vai trò sẽ có một hoặc nhiều điều khoản được giao (user_write, user_modify, report_read) v.v.
  3. Quyền cho Người dùng sẽ được kế thừa từ vai trò mà họ là
  4. Người dùng có thể được chỉ định với sự cho phép thủ công ngoài sự cho phép được thừa hưởng từ vai trò.

Để thực hiện việc này, tôi đã đưa ra thiết kế cơ sở dữ liệu sau.

role 
I store the role name here 
+----------+ 
| Field | 
+----------+ 
| id  | 
| roleName | 
+----------+ 

permission: 
I store the permission name and key here 
Permission name is for displaying to user. 
Permission key is for determining the permission. 
+----------------+ 
| Field   | 
+----------------+ 
| id    | 
| permissionName | 
| permissionKey | 
+----------------+ 

role_permission 
I assign permission to role here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| role_id  | 
| permission_id | 
+---------------+ 

user_role 
I assign role to the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| role_id  | 
+---------------+ 

user_permission 
I store the manual permission I may allow for the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| permission_id | 
+---------------+ 

Điều này cho phép tôi kiểm soát nhiều hơn ACL. Tôi có thể cho phép các superadmins tự gán quyền, v.v. Như tôi đã nói đây chỉ là để cho bạn ý tưởng.

+0

Cách thêm thông tin bổ sung về vai trò như quản trị viên công khai, v.v.? ví dụ quản trị viên có một số điều thêm để thêm như tên công ty .. và người dùng không có trường này? – james

+0

Tôi sẽ lưu trữ thông tin trong thực thể liên quan, bạn có thể thêm cột bổ sung vào bảng, nếu bạn muốn thêm thông tin cho vai trò thì bạn có thể thêm cột bổ sung trong bảng vai trò, tương tự cho bảng người dùng –

+0

nếu tôi có bảng người dùng với tên người dùng và mật khẩu của trường. Đây là thông tin chung cho tất cả người dùng. và tôi có bảng thành viên với một số lĩnh vực phụ như tên công ty, địa chỉ vv .. cũng như tôi có admin với một số thông tin hơn .. tôi cần phải sử dụng supertype/subtype quan hệ cho người dùng với người quản trị memebers? – james

0

Tôi tin rằng bạn nên thực hiện các quyền đó ở định dạng jSON.

bạn có thể tạo một bảng khác với quyền mà bạn có thể thêm, sửa đổi, xóa các hàng bất cứ lúc nào bạn muốn.

hoặc

mỗi lần người dùng xác thực bạn có thể lưu trữ các quyền đó trong phiên và chuyển nó cho tập lệnh của bạn.

Đề xuất cá nhân của tôi là tùy chọn đầu tiên.

0

Giống như Ibrahim nói, hãy tạo một bảng mới cụ thể cho các quyền của bạn.Gán giá trị bằng số cho người dùng đại diện cho cấp độ quyền của họ, nói 1 = đọc, 2 = ghi/đọc, 3 = sửa đổi/ghi/đọc. Sau đó, trong mã của bạn, hãy kiểm tra mức cấp phép thích hợp trước khi cho phép người dùng thực hiện một tác vụ cụ thể. Nếu họ không có giá trị yêu cầu (3 để sửa đổi hoặc> = 2 để viết) thì bạn chặn khả năng đó.

0

Tôi nghĩ bạn nên có bảng fave:

user 
user_x_profile 
profile 
profile_x_function 
function 

Bạn thiết lập khác nhau profile "generic" "xem", "nhân viên", "người quản lý" vv

Bạn thiết lập một "chức năng "mục nhập cho từng đối tượng bạn muốn kiểm soát.

Sau đó, liên kết các hàm với cấu hình trong profile_x_function.

Sau đó, chỉ định một hoặc nhiều cấu hình cho mỗi người dùng.

Điều này làm giảm nỗ lực quản trị. Giả sử bạn muốn thêm một hàm khác mà chỉ "người quản lý" mới có thể sử dụng - bạn chỉ cần thêm mục nhập mới trong bảng chức năng, sau đó thêm mục nhập trong bảng "profile_x_function" liên kết với hồ sơ "người quản lý" quyền đối với hồ sơ người quản lý và nó có sẵn cho tất cả các nhà quản lý.

Để truy cập truy vấn, bạn cần có năm bảng tham gia, nhưng bạn chỉ chọn một thuộc tính permision.

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