2010-01-05 81 views
6

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

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

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

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

我在想的另一种选择,感觉不太高贵,但我已经看到它做了很多:

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

我想知道的原因,是它喜欢它似乎在第二种方法中添加更多项目会更加简单,但在某些时候,这将成为维护方面的一个痛苦。你怎么看?

回答

5

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

3

我会选择#1,因为它给了我每种访问类型的单独标志。

我还建议您存储具有时间戳的更改历史记录。

1

我会去枚举路线。它的强类型,在数据库和代码之间转换得很好(ints和enums可以很好地转换),你可以使用FlagsAttribute来组合安全权限,并且枚举在版本问题上非常灵活(只要你不删除或者重命名以前定义的枚举值)。

1

你的'旗帜'的想法更加灵活,让你的权利的任何组合,如果有必要的话。该“FullAcc”项不应该被定义为您的枚举但是具体的数字, - 它应该是逻辑或运算,其他标志的组合(这个样子,还剩下了几个):

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

的只有我看到的这种情况是,如果向枚举中添加更多项目,则必须修改FullAcc项目,然后在db中标识您的FullAcc记录并更新标志值。

相关问题