Весенние роли безопасности загрузки для объекта - PullRequest
0 голосов
/ 20 ноября 2018

В настоящее время у моего приложения есть два типа пользователей: Администратор или Нормальный Пользователь.

Приложение имеет несколько проектов: 100 или более.В каждом проекте пользователь играет другую роль, например, владелец проекта, клиент и т. Д.

Сейчас я выясняю, как лучше всего разместить эти подзадачи на месте.Потому что в моих службах я хочу использовать PreAuthorise("hasRole('OWNER')"), чтобы только нужные люди могли выполнить обновление или что-то еще.

То, что я пробовал сейчас, - это предоставление каждому проекту списка пользователей, которые работают над ним с ролями (владелец проекта, клиент и т. Д.), Когда я регистрируюсь через Spring Security, я получаю пользователя и выбираювсе проекты, частью которых он является, и затем я добавляю роли следующим образом ROLE_PROJECTNAME_OWNER или ROLE_PROJECTNAME_CLIENT.

Дело в том, что я не могу использовать HASROLE, потому что есть много проектов, поэтомуЯ не могу заранее прокомментировать, какие проекты разрешают вызов метода в моем слое обслуживания.Я также не могу просто добавить OWNER, потому что тогда я не знаю, в каком проекте.Так что я немного застрял здесь, как это сделать правильно.

Ответы [ 2 ]

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

Определите свой собственный сервис для управления доступом с помощью пользователя / проекта / роли и позвоните в этот сервис прямо в своем @ PreAUthorize.

Просмотрите: https://dreamix.eu/blog/java/implementing-custom-authorization-function-for-springs-pre-and-post-annotations

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

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

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

Теперь внутри каждой службы будет отображаться соответствие между группами и ролями.Роли зависят от приложения, служба аутентификации или другие приложения не заботятся о них.Вы можете сохранить это отображение в базе данных отдельного приложения или в простом файле конфигурации (возможно, просто в application.yaml конкретного приложения).

В настоящее время ваши группы Admin и Normal, но у вас могут быть другие.Пользователь также может быть членом нескольких групп.Таким образом, в приложении 1 можно сказать, что Admin пользователи могут выполнять роль 1, роль 2, роль 3, тогда как Normal пользователи могут выполнять только role 1.Опять это много для многих.Это то, что ваш экземпляр UserDetails будет нести, как только он распознает аутентифицированного пользователя и его группы, которые затем сопоставляются с ролями как часть вашей конфигурации Spring Security.После этого вы сможете выполнять PreAuthorise("hasRole('OWNER')") и т. Д. В своих службах.

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

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

Эта архитектура, которую вы получите, показана на рисунке.

Microservice Security Model

Каждый сценарий использования (метод обслуживания, отмеченный @PreAuthorise) будет играть свою роль.Каждый пользователь будет связан с несколькими группами, которые предоставит система аутентификации.(Например, группы в Active Directory).После получения информации об аутентификации пользователя группы будут сопоставлены с ролями, специфичными для приложения, и заполнены в объекте UserDetails Spring Security.Каждый аннотированный метод получит специфичные для приложения роли (а не глобальные группы).

Это дает вам возможность добавлять столько групп, сколько вам нужно, которые могут иметь одну и ту же роль приложения.

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