2010-05-10 14 views
0

Я пытаюсь создать схему авторизации для моего приложения ASP.NET MVC, где Enum используется для установки разрешений. Например:Битфилд с тремя государствами ...?

[Flags] 
enum Permissions 
{ 
    ReadAppointments = 1, 
    WriteAppointments = 2 | ReadAppointments, 
    ReadPatients = 4, 
    WritePatients = 8 | ReadPatients, 
    ReadInvoices = 16, 
    WriteInvoices = 32 | ReadInvoices 
    ... 
} 

Но мне это не очень нравится, потому что на самом деле не ясно, что Write всегда включает Read.

Затем я понял, что требование состоит в том, что пользователь может иметь НЕТ доступ к, например, Назначениям.

По сути, я бы хотел «битполе» с тремя состояниями: нет, только для чтения, полным (чтение/запись). Я бы хотел использовать бит-бит enum, так как его легко хранить в БД (как int). Также очень легко увидеть, установлено ли разрешение.

Кто-нибудь знает, как это можно было бы легко выполнить с помощью Enum ... или я пойду в совершенно неправильном направлении?

EDIT: Я действительно стараюсь избегать хранения определений разрешений в БД, так как я действительно хочу, чтобы вещи были изменчивыми, не изменяя многое на конце БД. Было бы очень приятно узнать, как это сделает крупномасштабное приложение.

+0

Держите его в 4 штатах на низком уровне: Нет, х, но не Y, Y бот не X, X и Y. Кроме того, вместо 1,2, 4,8,16 использовать 1 сдвинутый на 0 бит, 1 сдвинут на 1 бит, 1 сдвинут на 2 бита и т. Д. –

ответ

3

Я бы, вероятно, сделал это как отдельные поля для каждой области (счета-фактуры, пациенты, встречи), используя единственное перечисление для покрытия каждого из них.

enum Permission { None, ReadOnly, ReadWrite }; 

Для меня это легче понять и управлять ими, а не объединить кучу несвязанных вещей (я должен сказать «казалось бы, не связанные», так как я ничего о приложении не знаю).

+0

Конечно, это то, о чем я тоже думал, но как это можно легко сохранить в базе данных для каждого поля. – TheCloudlessSky

+0

Я бы использовал три отдельных поля tinyint (sql server) для этих вещей - int работает также, но больше, чем вам нужно. – Ray

+0

Хорошо, но тогда по мере того, как приложение растет, я должен продолжать добавлять больше полей в таблицу ... не приятно ИМО. – TheCloudlessSky

-1

Неправильное направление. Ваше приложение будет расти, тогда битполя будет недостаточно, и вы будете много перерабатывать. Лучше получить «правильное» с самого начала.

+1

Хорошо, если это неправильное направление, что вы рекомендуете как «правильное»? – TheCloudlessSky

0

не означает, что значение 0 означает отсутствие разрешений? то есть:

-не могу изменить назначение, пациенты, или счетов

1 считывают назначения, но не может изменять другие

2, пишут назначения, но не может изменять другие

3 читаются/писать записи, но не могут изменять другие.

4 читается пациентами, но не может изменять других.

так что если у вас есть ...

51, что нет:

чтения/записи счета и чтения назначения/записи, но нет доступа к пациентам ...

0

Строго говоря, вы можете» t имеет битовое поле с чем-либо, кроме двух возможных значений, больше, чем вы можете иметь одну (десятичную) цифровую цифру с более чем десятью возможными значениями. База 2 означает два значения.

С учетом этого не сохраняйте разрешения для бизнеса как двоичные значения; вы будет пожалеете об этом позже. Храните их отдельно. Не стесняйтесь использовать битовое поле для определения особенностей разрешения (нет/read/write/etc.), Но не характер самого разрешения.

Почему это сообщество?

+0

Конечно, я подставку немного могу взять только два значения. Меня больше интересует подход к этому. EDIT: Должен был случайно щелкнуть Community Wiki ... Как отключить его? – TheCloudlessSky

+1

@ TheC, как только вы сделаете это CW, вы не можете его отменить – Earlz

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; } } 
} 
Смежные вопросы