Шаблон проектирования для проверки доступа пользователей permissions.net


Я прошу прощения, если это было задано раньше, но, оглядевшись в StackOverflow, я не смог найти что-то, что ответило бы на мой вопрос.

У меня есть система, состоящая из счетов. Каждая учетная запись может иметь несколько пользователей, и каждый пользователь может взаимодействовать друг с другом, пока они принадлежат к одной учетной записи. Пользователи из разных учетных записей не могут выполнять действия друг над другом. Кроме того, у меня есть такие роли, как Admin, RegularUser и т. д., Но эти роли ограничены каждой учетной записью. Вот это роли не позволяют пользователям из разных учетных записей выполнять действия с другими учетными записями.

Я ищу хороший способ реализации разрешений. Перед выполнением действия, скажем "добавить нового пользователя", я хочу проверить, имеет ли пользователь, выполняющий действие, необходимый уровень доступа (на основе различных правил, таких как роль, тип действия, если они принадлежат к одной учетной записи и т. д.).

Я собрал краткий пример того, как выглядит текущий код.

public interface IUserService
{
    void Add(User newUser);
    void Method1();
    void Method2();
    etc
}

public interface IAccountService
{
    void Create(Account newAccount);
    void Method1();
    void Method2();
    etc
}

public interface IUserAccessService
{
    bool CanPerformAction(int requesterId, otherparameters);
}

public class UserService
{
    private readonly IUserAccessService _userAccessService;

    public UserService(IUserAccessService userAccessService)
    {
        _userAccessService = userAccessService;
    }

    public void Add(User newUser)
    {
        if (!_userAccessService.CanPerformAction(xxx))
            throw;
        AddUser...
    }

    public void Method1()
    {
        if (!_userAccessService.CanPerformAction(xxx))
            throw;
        DoSomething...
    }

    public void Method2()
    {
        // do not check if user can perform action
        DoSomething...
    }
}

Я ищу a способ убедиться, что тот, кто реализует интерфейс, не забывает проверить наличие разрешений. Как вы можете видеть в приведенном выше коде, Add и Method1 требуют этой проверки, но Method2-нет.

Я думал использовать шаблон Шаблона дизайна для достижения этой цели (см. ниже), однако, похоже, что это не лучший подход.

public abstract class UserServiceBase
{
    public abstract void Add(User newUser);
    public abstract void Method1();
    public abstract void Method2();
    public abstract bool CanPerformAction(int requesterId, otherparameters);
    etc

    public void AddTemplateMethod(User newUser)
    {
        if (!CanPerformAction(newUser.Id, otherparamters)   
            throw;
        Add(newUser);
    }

    public void Method1TemplateMethod()
    {
        if (!CanPerformAction(someparameters)   
            throw;
        Method1();
    }

}

public abstract class UserService : UserServiceBase
{
    public override void Add(User newUser)
    {
        Add User...
    }

    public override void Method1()
    {
        Do something...
    }

    public override void Method2()
    {
        Do something...
    }
}

С кодом выше, по крайней мере, мы бы проверили, может ли пользователь выполнить действие или нет, но, как я уже сказал, мне это не кажется как лучший способ сделать это.

Если это поможет, я использую autofac в качестве своего IoC и использую C# .net 4.5.

Любой совет был бы очень признателен.

Заранее благодарю вас.

ПС. Я не уверен, что я объяснил себя очень хорошо, пожалуйста, дайте мне знать, если вам нужна дополнительная информация или разъяснения.

1 2

1 ответ:

Вы можете использовать шаблон декоратора, как в этом вопросе, но, как следует из вопроса, он лучше всего работает в сочетании с командой / запрос шаблон. Другой альтернативой является использованиеперехвата .

Какой бы метод вы ни выбрали, не помещайтесквозные проблемы в базовый класс, поскольку это может привести к объектуGod .