我正在尝试为我的ASP.NET MVC应用程序创建一个授权方案,其中使用Enum来设置权限。例如:
[Flags]
enum Permissions
{
ReadAppointments = 1,
WriteAppointments = 2 | ReadAppointments,
ReadPatients = 4,
WritePatients = 8 | ReadPatients,
ReadInvoices = 16,
WriteInvoices = 32 | ReadInvoices
...
}
但我并不喜欢这样,因为它确实没有说清楚Write总是包含Read。
然后我意识到要求是用户可能无权访问,例如,约会。
基本上,我想要一个具有3种状态的“位域”:无,只读,完整(读/写)。我还想使用枚举位域,因为它很容易存储在DB中(作为int)。此外,很容易看出是否设置了权限。
有没有人知道如何使用Enum轻松实现这一目标......或者我是否朝着完全错误的方向前进?
编辑:我真的试图避免在数据库中存储权限定义,因为我真的希望事情可以改变而不必在数据库端修改很多。了解大规模应用程序如何做到这一点真的很不错。
答案 0 :(得分:3)
我可能会将此作为每个区域(发票,患者,约会)的单独字段,使用单个枚举来覆盖每个区域。
enum Permission { None, ReadOnly, ReadWrite };
对我来说,这更容易理解和管理,并且它没有结合一堆无关的东西(我应该说“看似无关”,因为我对你的应用程序一无所知)。
答案 1 :(得分:0)
值不是0意味着没有权限?即:
0无法修改约会,患者或发票
1是读取约会,但不能修改其他人
2是写约会,但不能修改其他人
3是读/写约会,但不能修改其他人
4是阅读患者,但不能修改他人。所以,如果你有......
51那是:
读/写发票和读/写约会,但无法访问患者...
答案 2 :(得分:0)
严格地说,除了两个可能的值之外,你不能拥有除了两个可能值之外的其他任何值的位域,你可以拥有一个具有十个以上可能值的单个(十进制)数字。基数2表示两个值。
除此之外,不要将特定于业务的权限存储为二进制值;你以后会后悔。单独存放它们。您可以随意使用位域来定义权限的细节(无/读/写/等),但不权限本身的性质。
为什么这个社区维基?
答案 3 :(得分:0)
我从C# vs Java Enum (for those new to C#)
借用并修改了这个例子无论我不使用枚举,我都会使用一个允许更多灵活性的类。这样的事情可能有所帮助,只是不要添加患者和发票,因为它与读写权限问题正交。
有很多方法可以进行位操作,这应该可以在单独的代码层上完成。如果你需要对序列化进行位操作(对文件或数据库),那么你应该把那些代码放在那里。
我不太使用C#,因此语法可能会关闭,我主要使用Java。无论如何,基本概念应该在这里清楚:
public class Permissions
{
public static readonly Permissions NONE = new PERMISSIONS("NONE",false,false);
public static readonly Permissions READ = new PERMISSIONS("READ",true,false);
public static readonly Permissions FULL= new PERMISSIONS("FULL",true,true);
public static IEnumerable<Permissions> Values
{
get
{
yield return NONE;
yield return READ;
yield return FULL;
}
}
private readonly string name;
private readonly boolean read;
private readonly boolean write;
private readonly int bits;
Permissions(string name, boolean read,boolean write)
{
this.name = name;
this.read = read;
this.write= write;
this.bits = bits;
}
public string Name { get { return name; } }
// returns true if read permission is granted
public double isReadable { get { return read; } }
// returns true if write permission is granted
public double isWriteable { get { return write; } }
public override string ToString()
{
return name;
}
// returns bit field
public int bits { get { return write ? 1 : 0 | read ? 2 : 0; } }
}
答案 4 :(得分:-1)
错误的方向。你的应用程序将会增长,然后位域将不再足够,你需要进行大量的返工。从一开始就更好地“适当”。