2010-01-05 2 views
6

Tôi đang lưu trữ danh sách "Người dùng" trong bảng. Logic nghiệp vụ của ứng dụng sẽ có tham chiếu đến một đối tượng có tất cả dữ liệu trong bảng này cho người dùng hiện đã đăng nhập. Và có thể cho phép người dùng thực hiện các hoạt động nếu họ có quyền truy cập chính xác.Lưu trữ cấp truy cập của người dùng trong cơ sở dữ liệu

Tôi tự hỏi cách tốt nhất để lưu trữ "cấp truy cập" là gì? Một trong những cách tôi đang nghĩ đến việc lưu trữ cấp độ truy cập là một số nguyên, và sử dụng C# "cờ" để kết hợp nhiều cấp độ truy cập mà không yêu cầu một loạt các trường, điều này là khôn ngoan không? Không.

Create = 1 
Read = 2 
Update = 4 
Delete = 8 
FullAcc = 16 

Các tùy chọn khác Tôi đang nghĩ đến việc, cảm thấy ít elegent, nhưng tôi đã nhìn thấy nó làm rất nhiều:

Read/Write = 1 
R/W + Delete= 2 
Full Access = 3 

Lý do tôi đang tự hỏi, là nó có vẻ như nó sẽ đơn giản hơn để thêm các mục bổ sung vào phương pháp thứ hai, nhưng tại một số điểm, nó sẽ trở thành một nỗi đau trong ass để duy trì. Quan điểm của bạn là gì?

Trả lời

5

Tôi đã luôn ưu tiên phương pháp tiếp cận đầu tiên bằng cờ. Nguy hiểm là bạn nhận được quá nhiều cấp quyền và bạn phải tiếp tục mở rộng enum của bạn và bắt đầu sử dụng số lượng lớn và có thể phải thay đổi kiểu dữ liệu trong cơ sở dữ liệu của bạn thành một int lớn. Tuy nhiên, đối với một cái gì đó như quyền, số lượng các tùy chọn nên được khá hạn chế. Một gợi ý tôi sẽ thực hiện là có FullAcc được định nghĩa là tổng của Tạo, Đọc, Cập nhật và Xóa thay vì là một thực thể riêng biệt. Bằng cách đó bạn sẽ không phải kiểm tra xem người dùng có quyền cập nhật HOẶC FullAcc khi họ đang cố gắng cập nhật một cái gì đó hay không.

3

Tôi sẽ sử dụng Tùy chọn số 1 vì nó cung cấp cho tôi từng cờ riêng lẻ cho từng loại quyền truy cập.

Tôi cũng khuyên bạn nên lưu trữ lịch sử thay đổi với dấu thời gian.

1

Tôi muốn đi tuyến đường enum. Nó được gõ mạnh mẽ, chuyển giao hợp lý giữa db và mã (ints và enums cast well), bạn có thể sử dụng FlagsAttribute để kết hợp các quyền bảo mật và enums khá linh hoạt khi nói đến các vấn đề về phiên bản (miễn là bạn không xóa hoặc đổi tên các giá trị enum đã xác định trước đó).

1

Ý tưởng 'cờ' của bạn linh hoạt hơn, cho phép bạn kết hợp các quyền nếu điều đó trở nên cần thiết. Các 'FullAcc' item không nên được định nghĩa là một số cụ thể trong enum của bạn, tuy nhiên - nó phải là một sự kết hợp của những lá cờ khác or'd với nhau (như thế này, với một vài trái ra):

enum Rights { Create, read, Update, FullAcc = Create | Read | Update } 

Các chỉ đau tôi thấy với điều này là nếu bạn thêm nhiều mục vào enum, bạn phải sửa đổi mục FullAcc, và sau đó xác định hồ sơ FullAcc của bạn trong db và cập nhật giá trị cờ.