在数据库中存储用户访问级别

时间:2010-01-05 18:25:01

标签: c# .net database database-design

我在表格中存储“用户”列表。应用程序的业务逻辑将引用一个对象,该对象包含此表中当前登录用户的所有数据。并且如果用户具有正确的访问权限,则允许用户执行操作。

我想知道存储“访问级别”的最佳方式是什么?

我考虑存储访问级别的一种方式是整数,并且使用C#“flags”来组合多个访问级别而不需要一堆字段,这是明智的吗?

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

我正在考虑的另一个选择,感觉不那么优雅,但我已经看到它做了很多:

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

我想知道的原因是,在第二种方法中添加其他项目似乎更简单,但在某些时候,维护它会变得很麻烦。你有什么想法?

4 个答案:

答案 0 :(得分:5)

我总是喜欢使用标志的第一种方法。危险在于您获得了太多级别的权限,并且您必须继续扩展枚举并开始使用大量数据,因此可能必须将数据库中的数据类型更改为大型int。但是,对于类似权限的内容,选项的数量应该相当有限。我要做的一个建议是将FullAcc定义为Create,Read,Update和Delete的总和,而不是作为单独的实体。这样,您在尝试更新某些内容时无需检查用户是否具有Update或FullAcc权限。

答案 1 :(得分:3)

我会使用选项#1,因为它为每种类型的访问提供了单独的标志。

我还建议您使用时间戳存储更改历史记录。

答案 2 :(得分:1)

我会去enum路线。它的强类型,在db和代码之间传输得相当好(内联和枚举很好),你可以使用FlagsAttribute来组合安全权限,并且在版本问题上枚举非常灵活(只要你不删除)或重命名先前定义的枚举值。)

答案 3 :(得分:1)

您的“旗帜”想法更灵活,如果有必要,您可以使用任何权利组合。不应将“FullAcc”项目定义为枚举中的特定数字 - 它应该是其他标志的组合或一起使用(如此,剩下一些):

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

我看到的唯一痛苦是,如果您向枚举添加更多项,则必须修改FullAcc项,然后在db中标识FullAcc记录并更新标记值。