Основная информация и информация о данных в моем API связаны с проектом (Entity), Что такое хороший подход для потока паролей: управлять определенным разрешением, связанным с проектом, с весенняя безопасность и OAuth2?Oauth2/Разрешение пароля для проверки подлинности для определенного объекта
В этом приложении вы имеете 5 микро обслуживание:
- UAA microservice: сервер авторизации
- Каталог microservice
- Заказать microservice
- microservice Счет
- microservice Клиент
Увеличить разрешение:
Каждый пользователь может иметь много проекта, и может иметь разрешение для каждого проекта:
- CAN_MANAGE_CATALOG
- CAN_VIEW_CATALOG
- CAN_MANAGE_ORDER
- CAN_VIEW_ORDER
- CAN_MANAGE_INVOICE
- CAN_VIEW_INVOICE
- ...
У меня есть много идеи, но я не уверен, если у меня есть хороший подход:
использование: Я хочу securise конечной точки:
http://catalog-service/{project_key}/catalogs
только пользователи, имеющие разрешение VIEW_CATALOG ИЛИ MANAGE_CATALOG для проекта {project_key} может список всех каталогов, присутствующий в проекте
Моя первая мысль: USE ProjectAccessExpression с предварительного блокирования средств на
CatalogController.java
@Controller
public class CatalogController {
@PreAuthorize("@projectAccessExpression.hasPermission(#projectKey, 'manageCatalog', principal)" +
" or @projectAccessExpression.hasPermission(#projectKey, 'viewCatalog', principal)")
@RequestMapping(
value = "/{projectKey}/catalogs",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE
)
public @ResponseBody List<Catalog> findByProject(@PathVariable("projectKey") String projectKey) {
return catalogService.find();
}
}
ProjectAccessExpression.Java
@Component
public class ProjectAccessExpression {
private RestTemplate restTemplate;
public boolean havePermission(String projectKey, String permission , String username) {
Boolean havePermission = restTemplate.getForObject(String.format("http://uaa-service/permission/check?project=%1&permission=%2&username=%3",
projectKey, permission, username
), Boolean.class);
return havePermission;
}
}
Неудобство: это нужно вызвать UAA службу каждый раз
Вторая идея: USE USER_ROLE
С USER_ROLE
- пользователя | роль
- mylogin1 | SHOP1 .CAN_MANAGE_CATALOG
- mylogin1 | SHOP1 .CAN_VIEW_CATALOG
- mylogin1 | SHOP2 .CAN_MANAGE_CATALOG
- mylogin1 | SHOP2 .CAN_VIEW_CATALOG
- mylogin1 | SHOP2 .CAN_MANAGE_ORDER
- mylogin1 | Shop2 .CAN_VIEW_ORDER
- ...
SHOP1 является Shop2 является projectKey
Неудобства: я не уверен, но если разрешения изменения пользователя, мне нужно отменить все лексемы ассоциировать
Третья идея: добавить специальное разрешение при аутентификации blob
Я не знаю, как это сделать для хранения ...
И в контроллере аннотации:
@PreAuthorize("@ProjectAccessExpression.hasPermission(authentication, 'manageCatalog||viewCatalog', #projectKey)
Неудобства: такой же неудобный второй идее
Привет Мэтью, в первую очередь спасибо за ваш ответ, но я не знаю, как ваша ссылка или глава может помочь знать подход или решить эту проблему вопрос «сопоставление ролей пользователей с областями» https://raymondhlee.wordpress.com/2014/12/21/implementing-oauth2-with-spring-security/. У вас есть какой-нибудь прецедент? – timactive
Настоящий трюк здесь - это то, что вы хотели бы получить высококачественную защиту по различным областям вашего приложения. Таким образом, вы можете настроить собственные области для каждой области приложения, а затем сопоставить разные роли пользователей в разных областях. Это даст вам очень тонкий контроль, поскольку вы можете настроить в основном бесконечные комбинации уровней и применить их к различным областям приложений. «реализовать свои собственные правила для отображения областей видимости для ролей» –
Ok Matthew, я думаю, это всего лишь базовая схема, и этот пример не показывает, как динамически определять конкретную авторизацию по моей проблеме. Пример ROLE_MANAGEPRODUCT_ {PROJECTKEY}, ключ проекта создается после пользователя. – timactive