Авторизация безопасности и ролей с использованием шаблона представления презентатора модели - PullRequest
2 голосов
/ 12 ноября 2009

Где наиболее подходящее место для авторизации безопасности и ролей в соответствии с шаблоном проектирования презентатора представления модели?

Будет ли для всех страниц, реализующих безопасность, реализовывать определенный интерфейс, скажем, IAuthorizedView, что соответствует

public interface IAuthorizedView : IView
{
    IUser user;
    void AuthorizationInitialized();
    void AuthorizationInvoked();
}

Затем обрабатывается внутри уровня презентатора

public abstract class Presenter<TView> where TView : IView
{
    public TView View { get; set; }

    public virtual void OnViewInitialized()
    {
    }

    public virtual void OnViewLoaded()
    {
    }
}

public abstract class AuthorizationSecuredPresenter<TView> 
                        : Presenter<TView> where TView : IAuthorizedView 
{
    public override void OnViewInitialized()
    {
        View.AuthorizationInitialized();
        base.OnViewInitialized();
    }

    public override void OnViewLoaded()
    {
        View.AuthorizationInvoked();
        base.OnViewLoaded();
    }
}

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

Ответы [ 3 ]

3 голосов
/ 21 ноября 2009

Вот кое-что, что вы можете рассмотреть.

Я бы использовал шаблон декоратора для отдельной авторизации каждого вызова вашего объекта.

Допустим, у вас есть следующий класс:

public class MyService
{
    public virtual void DoSomething()
    {
        //do something on the server
    }
}

Затем вы приступите к созданию базового декоратора для реализации конструктора по умолчанию, например:

public class MyServiceDecoratorBase : MyService
{
    public MyServiceDecoratorBase(MyService service)
    {
    }
}

После настройки вы можете начать оформление, создав авторизационный декоратор, подобный следующему:

public class MyServiceAuthorizationDecorator : MyServiceDecoratorBase
{
    private readonly MyService _service;
    public MyServiceDecoratorBase(MyService service)
    {
        _service = service;
    }

    public override void DoSomething()
    {
        //TODO: Authorize the user here.
        _service.DoSomething();
    }
}

Так что теперь, когда основные классы сделаны ... как вы собираетесь все это называть? Легко!

MyService service = new MyServiceAuthorizationDecorator(new MyService());
service.DoSomething();

Теперь ... преимущество всего в том, что ваша логика авторизации полностью отделена от логики вашего основного сервиса (или объекта). Почему это важно? Тестируемость. Вы можете протестировать свой основной сервис независимо от логики авторизации. Это соответствует принципу открытия / закрытия.

Теперь, допустим, вы хотите рассчитать производительность для этих надоедливых методов ... добавьте декоратор! Логирование? Еще один декоратор! Все они могут быть прикованы таким образом. Конечно, чем больше вы добавляете и тем тяжелее это становится, но я думаю, что оно того стоит за преимущество, которое оно дает.

Комментарии

2 голосов
/ 21 ноября 2009

Ваш дизайн выглядит отлично; что касается вашего заключительного вопроса ...

, если мы перейдем от исключительно веб-и добавил любой тип API, который требуется авторизация на уровне сервиса что в конечном итоге много дублирование проверки доступа или что вполне приемлемо для проверки дважды и должен быть рассчитан на передний

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

  • Во-первых, внутри вашего бизнес-уровня - для обеспечения безопасности применяется независимо от контекста выполнения.

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

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

0 голосов
/ 20 ноября 2009

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

Затем докладчик должен взять эти данные и проверить их с помощью API и модели, представленной в модели.

В моем приложении CAD / CAM фактический API находится в самой низкой из моих приложений - сборке утилит. Я обертываю и соединяю его так, чтобы, если у меня был шанс, что мой API безопасности, верхние уровни не видели ничего другого Утилита сообщает мне, является ли введенная информация действительной или нет, и какой уровень безопасности предоставить человеку.

Более конкретное зависит от того, какой именно API безопасности вы используете.

...