В поисках лучшего способа использования нескольких ролей в компоненте Blazor AuthorizeView - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над небольшим приложением, которое использует Blazor и Аутентификацию / Авторизацию, и по большей части авторизация на основе ролей идеальна. Однако у меня есть пара сценариев ios, где мне нужно авторизовать несколько ролей в компоненте AuthorizeView, и я не уверен, что делаю это наилучшим образом. Я пытаюсь избежать жесткого кодирования строковых значений в компоненты, поэтому я начал с установки класса stati c для управления строковыми значениями следующим образом:

public static class Roles
{
    public const string Admin = "Admin"; 
    public const string CanManageClients = "CanManageClients"; 
    public const string CanManageProjects = "CanManageProjects"; 
}

Теперь я могу использовать эти значения везде, где они мне нужны, и для стандартной авторизации на основе атрибутов я расширил класс AuthorizeAttribute, чтобы позволить мне передавать несколько значений по мере необходимости. Теперь у меня есть атрибут [AuthorizeRoles] для использования. Пока проблем нет. Я могу украсить всю страницу примерно так:

@attribute [AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]

и декорирование соответствующего метода по мере необходимости:

[AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]
public void DoTheThing()
{
    //Doing things
}

Однако, когда дело доходит до компонента Blazor AuthorizeView, все становится сложно. , Синтаксис Razor не позволяет мне связывать несколько ролей вместе или интерполировать строку, поэтому я нашел обходной путь, который выполняет работу:

<AuthorizeView Roles="@rolesList">
    <Authorized>
        //View related code once authorized
    </Authorized>
</AuthorizeView>

И связанный блок кода, который создает строку, разделенную запятыми, которая Компонент ожидает:

@code {
    string rolesList => $"{Roles.Admin}, {Roles.CanManageClients}";
}

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

1 Ответ

1 голос
/ 16 апреля 2020

Это может помочь вам

<AuthorizeView Roles="@($"{Roles.Admin}, {Roles.CanManageClients}")">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...