Как настроить loginconfig в Java EE - PullRequest
0 голосов
/ 06 августа 2020

У меня есть серверное приложение 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 механизма аутентификации?

Всем спасибо!

...