Можете ли вы оценить атрибут метода во время выполнения? - PullRequest
2 голосов
/ 18 мая 2011

У меня есть проект Winforms, который свободно основан на MVVM. Безопасность реализуется на уровне домена с использованием атрибута PrincipalPermissionAttribute, например:

Public Class Order

     <PrincipalPermissionAttribute(SecurityAction.Demand, Role:="Managers")> _
    Public Sub ChangeBillingAddress(NewAddress as Address)

        Me.BillingAddress = NewAddress

    End Sub


End Class

Я бы хотел, чтобы мой ViewModel мог указывать представление о том, какие элементы управления включать / отключать, на основе атрибута PrincipalPermissionAttribute в домене:

Public Class OrderViewModel

    Private _Order as Order
    Public Sub New(Order as Order)
        _Order = Order
    End Sub

    Public Readonly Property ChangeBillingAddressEnabled as Boolean
        Get
            'Here I want to take Thread.CurrentPrincipal and evaluate
            'it's Role against the PrincipalPermissionAttribute on 
            '_Order.ChangeBillingAddress.  If the user will succeed
            'in changing the billing address return True, else return False.
        End Get

    End Property
End Class

Есть ли у ViewModel способ оценить атрибут PrincipalPermissionAttribute и определить, будет ли текущий Thread.Principal успешным?

1 Ответ

1 голос
/ 18 мая 2011

Да, вы определенно можете вернуть атрибуты метода и что-то с ними делать.

Например (извините в C #):

return _Order.GetType()
             .GetMethod("ChangeBillingAddress")
             .GetCustomAttributes(typeof(PrincipalPermissionAttribute), true)
             .Cast<PrincipalPermissionAttribute>()
             .All(r => IsPermittedAccess(r, Thread.CurrentPrincipal));

Где можно узнать, что делать с атрибутом:

bool IsPermittedAccess(PrincipalPermissionAttribute rule, IPrincipal user)
{
    // return ?
    throw new NotImplementedException();
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...