У меня есть EAR.
В нем много модулей EJB с большим количеством EJB.
Каждый EJB содержит множество веб-сервисов, некоторые с общим интерфейсом, некоторые специфицируются c для EJB.
Мне нужно защитить свои остальные вызовы токеном и использовать некоторое разрешение области.
Например, у меня есть EJB, управляющий корзиной покупок:
@Stateless(name = "ServiceCart")
@Path(value = "cart")
public class ServiceCart implements ServiceInterface {
@Path(value = "/{id}")
@GET
@Produces(value = {MediaType.APPLICATION_JSON})
public Cart getRecord(@PathParam(value = "id") Long id){
Cart c = new Cart(id, "TEST00001", "Joe Doe");
return c;
}
@Path(value = "/delete/{id}")
@GET
@Produces(value = {MediaType.APPLICATION_JSON})
public String deleteRecord(@PathParam(value = "id") Long id){
return "Deleted id {0}";
}
}
Веб-сервис защищен логином. Чтобы разрешить доступ, я должен создать RESOURCE под названием «CartModule», защищающий URL «/ api / cart / *», политику под названием «role_customer» с правилом role = CUSTOMER ".
Я создаю роль-разрешения " CartCustomer ", в которой CartModule выбирается в качестве ресурса, а" role_customer "в качестве политики. Теперь, если клиент звонит в службу, звонки разрешены.
Хорошо, методы защищены логином.
Теперь мне нужно, чтобы пользователь не удалил корзину покупок, поэтому я создаю Область авторизации ПРОЧИТАЙТЕ и УДАЛИТЕ и добавила его в CartModule.
Я изменил разрешение на scope-разрешение с ресурсом = CartModule, policy = role_customer и только scope READ.
Как я могу сказать keycloak, что первый метод - "READ", а другой - "DELETE"? Даже если я создаю это разрешение, все методы будут разрешены.
Другая проблема:
У меня много EJB (около 60), один для jpa-entity с как минимум 10 веб-службами каждый, поэтому я не могу создать ресурс для каждого отдельного вызова и каждой роли. Другой вопрос, я не могу доверять звонку клиента для получения объема