.NET Core - фильтрация данных по пользовательским разрешениям - PullRequest
2 голосов
/ 05 марта 2019

У меня есть система, где помимо ролей у нас есть права на точные данные.Например, пользователь имеет разрешение на книгу А, но не имеет - на книгу Б - поэтому он не видит ее в списке.Мы управляем этим, используя таблицы базы данных, где мы храним все разрешения.Таким образом, метод получения списка объектов выглядит примерно так:

GetList().Where(x => x.Permissions.Any(p => p.CanRead && p.UserId == userId))

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

1 Ответ

0 голосов
/ 06 марта 2019

Основываясь на документе Крис Пратт, я предлагаю вам использовать это разрешение:

Task<AuthorizationResult> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          IEnumerable<IAuthorizationRequirement> requirements);
Task<AuthorizationResult> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          string policyName);

У меня есть пример в View для отображения кнопки «View» для книги A, но не для книги B ниже:

Во-первых, у меня есть 3 роли («Администратор», «Пользователь», «Персонал») - администратор ролей может читать как книги А, так и В, но только сотрудники отдела могут читать книгу А. Затем, когда вход в систему для сотрудников, AuthorizationService будет проверьте разрешение «ЧИТАТЬ» и, если у этого сотрудника нет разрешения на чтение Книги B, кнопка «Просмотр» не появится:

@if ((await AuthorizationService.AuthorizeAsync(User, "STAFF", Operations.Read)).Succeeded)
        {
            <div>
                <div class="input-group-btn">
                    <button id="btnRead" class="form-control btn-info">View</button>
                </div>
            </div>
        }

И на странице Роль вам также нужна таблица для назначения каждого разрешения каждой книге. Вы используете учетную запись администратора, и для каждой роли есть дерево или таблица, отображающая все категории книг, в каждой категории книг будут установлены флажки «Читать», «Удалить», «Создать». Затем, если вы установите флажок «Удалить» bookB в роли «Staff», то все учетные записи сотрудников будут иметь разрешение на удаление книги B. Надеюсь, эта помощь!

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