Bitfield有3个国家......?

时间:2010-05-10 17:28:26

标签: c# asp.net-mvc bitmap

我正在尝试为我的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轻松实现这一目标......或者我是否朝着完全错误的方向前进?

编辑:我真的试图避免在数据库中存储权限定义,因为我真的希望事情可以改变而不必在数据库端修改很多。了解大规模应用程序如何做到这一点真的很不错。

5 个答案:

答案 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)

错误的方向。你的应用程序将会增长,然后位域将不再足够,你需要进行大量的返工。从一开始就更好地“适当”。