У меня есть серверное приложение Java EE. Приложение (ear) содержит 3 модуля: core (ejb), private (war) и publi c (тоже war).
Я должен выполнить аутентификацию для publi c и частных модулей. Для аутентификации мы используем 2 разных Keycloak (publi c имеет собственный Keycloak, а private также имеет собственный Keyclaok).
Я сделал класс CustomerServiceApplication (для publi c module auth) и расширяется приложением, затем я использую Аннотация @LoginConfig для использования метода аутентификации "MP-JWT":
import org.eclipse.microprofile.auth.LoginConfig;
import javax.annotation.security.DeclareRoles;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
@LoginConfig(authMethod = "MP-JWT", realmName = "public")
@DeclareRoles({"customer"})
public class CustomerServiceApplication extends Application {
}
Затем создайте файл META-INF / microprofile-config.properties:
mp.jwt.verify.publickey.location=http://keycloak-test.local:8080/auth/realms/customer-service/protocol/openid-connect/certs
mp.jwt.verify.issuer=http://keycloak-test.local:8080/auth/realms/customer-service
Я сделал то же самое для частный модуль:
import org.eclipse.microprofile.auth.LoginConfig;
import javax.annotation.security.DeclareRoles;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
@LoginConfig(authMethod = "MP-JWT", realmName = "private")
@DeclareRoles({"cargo_admin"})
public class CargoServiceApplication extends Application {
}
И файл свойств:
mp.jwt.verify.publickey.location=http://podev.local:8180/auth/realms/master/protocol/openid-connect/certs
mp.jwt.verify.issuer=http://podev.local:8180/auth/realms/master
В конечных точках я установил аннотации @RolesAlowed, @DenyAll.
Наконец, о моей проблеме. Когда я вхожу в любой из сервисов - все в порядке. Но когда я пытаюсь войти в другую службу - я получил ошибку 401. Unauthorized.
Например: если я сначала вхожу в личный кабинет, то я не могу войти в publi c и наоборот.
Как я понимаю, контейнер использует первый задействованный механизм аутентификации. И использует это для сравнения токенов. Но когда я использую токен, выданный другим механизмом, он отклоняется.
Как мне настроить 2 механизма аутентификации?
Всем спасибо!