Заниматься безопасностью и быть отделенным - PullRequest
0 голосов
/ 12 сентября 2009

Я пытаюсь создать приложение в 3 слоя:

1) Уровень доступа к данным
2) бизнес-уровень
3) Пользовательский интерфейс

Я стараюсь не связывать классы, поэтому на бизнес-уровне я создал интерфейсы для классов доступа к данным, например:

public interface ICountryRepository:IRepository 
{
    Country  GetCountry(int ID);

    int CreateCountry(Country obj);
    Boolean UpdateCountry(Country obj);
    Boolean DeleteCountry(Country obj);
    ...
    ...
 }

и я передаю интерфейс в качестве параметра конструктору службы:

   public CountryService(ICountryRepository repository,ILanguageRepository lang_repository)
   {       
    ....
   }

Но на CountryService, например, мне нужно загрузить текущего пользователя и его разрешения, чтобы я мог проверить, применима ли операция:

    public Country GetCountry(int ID)
    {

        if securityService.UserHasPermission(currentUser, GetPermission("CanGetCountry"))
        {
           return repository.GetCountry(ID);
        }
        else
        { 
           Throw(New SecurityException("No permissions for that operation ...."))
        }

    }

Это означает, что я должен создать экземпляр объекта SecurityDataAccess и передать его конструктору SecurityService в моей сборке бизнес-уровня, которую я стараюсь избегать для поддержания развязки объектов. Прямо сейчас у меня даже нет ссылки на какую-либо сборку DataAccess в моей бизнес-сборке.

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

У кого-нибудь есть предложения по решению этой проблемы?

Ответы [ 3 ]

1 голос
/ 12 сентября 2009

Почему бы не добавить службу безопасности в конструктор службы Country? Таким образом, Контейнер IOC может разрешить зависимость и внедрить защиту, если это необходимо. Это означает, что контейнер IOC позаботится о создании вашего объекта CountryService. И вы будете использовать контейнер для получения всех услуг.

Еще один вариант - немного нормализовать ваш репозиторий ...

Обрежьте его до 4-5 базовых функций, которые одинаковы для всех репозиториев, затем используйте дженерики, чтобы все они выглядели одинаково, поэтому нет

UpdateCountry (...) но Обновление (T объект)

Примерно так: http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the-generic-repository.aspx

Затем вы можете использовать шаблон цепочки ответственности, чтобы поместить свой код безопасности перед кодом БД (http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern)

Таким образом, у вас может быть SecurityChecker, который проверяет доступ, выдает исключение, если оно недопустимо, или передает запрос в следующую ссылку в цепочке (вы также можете динамически добавить запись в журнал таким образом, или синхронизацию или что-то еще)

0 голосов
/ 14 сентября 2009

Это может быть не так, извините, если да, я скрывающийся программист Java EE. Мне кажется, что авторизация методов лучше решается в инфраструктуре, декларативно.

Эта статья , по-видимому, предполагает, что .Net, как и Java EE, предоставляет возможность декларативного управления доступом. Этот подход работает для вас?

0 голосов
/ 12 сентября 2009

Вам необходимо реализовать защиту на уровне доступа к данным? Если вы переместите свою службу безопасности на бизнес-уровень, как предлагает Хейко. Другими словами, обеспечьте безопасность на бизнес-уровне, и вы полностью избежите проблемы IoC.

...