Шаблон проектирования для проверки доступа пользователей 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 ответ:
Вы можете использовать шаблон декоратора, как в этом вопросе, но, как следует из вопроса, он лучше всего работает в сочетании с командой / запрос шаблон. Другой альтернативой является использованиеперехвата .
Какой бы метод вы ни выбрали, не помещайтесквозные проблемы в базовый класс, поскольку это может привести к объектуGod .