Zabezpečení aplikací Spring Boot v Javě pomocí Microsoft Entra ID

Tento článek představuje webovou aplikaci v Javě a Spring Bootu, která přihlašuje uživatele do vašeho tenanta Microsoft Entra ID pomocí klientské knihovny Microsoft Entra ID Spring Boot Starter pro Javu. Používá protokol OpenID Connect.

Následující diagram znázorňuje topologii aplikace:

Diagram znázorňující topologii aplikace.

Klientská aplikace používá klientskou knihovnu Microsoft Entra ID Spring Boot Starter pro Javu k přihlášení uživatele a získání tokenu ID z Microsoft Entra ID. Token ID prokáže, že se uživatel ověřuje pomocí Microsoft Entra ID a umožňuje uživateli přístup k chráněným trasám.

Požadavky

Doporučení

  • Určitá obeznámenost s Spring Framework.
  • Znalost terminálu Linux/OSX
  • jwt.ms ke kontrole vašich tokenů.
  • Fiddler pro monitorování síťové aktivity a řešení problémů.
  • Sledujte blog Microsoft Entra , abyste zůstali up-to-datem s nejnovějším vývojem.

Nastavení ukázky

Následující části ukazují, jak nastavit ukázkovou aplikaci.

Klonování nebo stažení ukázkového úložiště

Pokud chcete ukázku naklonovat, otevřete okno Bash a použijte následující příkaz:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in

Případně přejděte do repozitáře ms-identity-msal-java-samples, pak si ho stáhněte jako soubor .zip a rozbalte ho na pevný disk.

Důležité

Abyste se vyhnuli omezením délky cest v systému Windows, doporučujeme naklonovat do adresáře blízko kořene disku.

Registrace ukázkových aplikací v tenantovi Microsoft Entra ID

V této ukázce je jeden projekt. V následujících částech se dozvíte, jak aplikaci zaregistrovat pomocí webu Azure Portal.

Zvolte tenanta Microsoft Entra ID, ve kterém chcete vytvářet aplikace.

Pokud chcete zvolit tenanta, postupujte následovně:

  1. Přihlaste se k portálu Azure.

  2. Pokud se váš účet nachází ve více než jednom klientovi Microsoft Entra ID, vyberte svůj profil v rohu portálu Azure a potom výběrem možnosti Přepnout adresář přepnete relaci do požadovaného klienta Microsoft Entra ID.

Registrace aplikace (java-spring-webapp-auth)

Aplikaci zaregistrujete pomocí následujících kroků:

  1. Přejděte na portál Azure a vyberte Microsoft Entra ID.

  2. V navigačním podokně vyberte Registrace aplikací a pak vyberte Nový zápis.

  3. Na zobrazené stránce Zaregistrovat aplikaci zadejte následující informace pro registraci aplikace:

    • V části Název zadejte smysluplný název aplikace, který se bude zobrazovat uživatelům aplikace – například java-spring-webapp-auth.
    • V části Podporované typy účtů vyberte jenom jednoho tenanta – TENANT_NAME (TENANT_NAME liší se podle tenanta).
    • V oddílu Identifikátor URI pro přesměrování (volitelné) vyberte v rozevíracím seznamu možnost Web a zadejte následující identifikátor URI pro přesměrování: http://localhost:8080/login/oauth2/code/.
  4. Výběrem možnosti Registrovat aplikaci vytvořte.

  5. Na stránce registrace aplikace vyhledejte a zkopírujte hodnotu ID aplikace (klienta), kterou chcete použít později. Tuto hodnotu použijete v konfiguračním souboru nebo souborech vaší aplikace.

  6. Na registrační stránce aplikace vyberte v navigačním podokně certifikáty a tajné kódy a otevřete stránku, kde můžete vygenerovat tajné kódy a nahrát certifikáty.

  7. V části Tajné klíče klienta vyberte Nový tajný klíč klienta.

  8. Zadejte popis – například tajný kód aplikace.

  9. Vyberte jednu z dostupných dob trvání : 180 dní (6 měsíců),90 (3 měsíce), 365 dnů (12 měsíců), 545 dnů (18 měsíců) nebo 730 dnů (24 měsíců).

  10. Vyberte Přidat. Zobrazí se vygenerovaná hodnota.

  11. Zkopírujte a uložte vygenerovanou hodnotu pro použití v dalších krocích. Tuto hodnotu potřebujete pro konfigurační soubory kódu. Tato hodnota se znovu nezobrazí a nemůžete ji načíst žádným jiným způsobem. Před přechodem na jinou obrazovku nebo podokno si ho proto nezapomeňte uložit z webu Azure Portal.


Nakonfigurujte aplikaci (java-spring-webapp-auth) tak, aby používala registraci vaší aplikace

Ke konfiguraci aplikace použijte následující postup:

Poznámka:

V následujících krocích ClientID označuje totéž co Application ID nebo AppId.

  1. Otevřete projekt v integrovaném vývojovém prostředí (IDE).

  2. Otevřete soubor src\main\resources\application.yml.

  3. Najděte zástupný symbol Enter_Your_Tenant_ID_Here a nahraďte stávající hodnotu ID svého tenanta Microsoft Entra.

  4. Vyhledejte zástupný symbol Enter_Your_Client_ID_Here a nahraďte existující hodnotu ID aplikace java-spring-webapp-auth nebo ID aplikace clientId, kterou jste zkopírovali z portálu Azure.

  5. Vyhledejte zástupný symbol Enter_Your_Client_Secret_Here a nahraďte stávající hodnotu hodnotou, kterou jste si uložili při vytváření java-spring-webapp-auth a zkopírovali z portálu Azure.

Spusťte ukázku

Následující části ukazují, jak nasadit ukázku do Azure Container Apps.

Požadavky

Příprava projektu Spring

Pomocí následujících kroků připravte projekt:

  1. K sestavení projektu použijte následující příkaz Maven:

    mvn clean verify
    
  2. Spusťte ukázkový projekt místně pomocí následujícího příkazu:

    mvn spring-boot:run
    

Nastavení

Pokud se chcete přihlásit k Azure z rozhraní příkazového řádku, spusťte následující příkaz a podle pokynů dokončete proces ověřování.

az login

Pokud chcete zajistit, že používáte nejnovější verzi rozhraní příkazového řádku, spusťte příkaz upgrade.

az upgrade

Dále nainstalujte nebo aktualizujte rozšíření Azure Container Apps pro rozhraní příkazového řádku.

Pokud se při spouštění příkazů az containerapp v Azure CLI zobrazí chyby o chybějících parametrech, ujistěte se, že máte nainstalovanou nejnovější verzi rozšíření Azure Container Apps.

az extension add --name containerapp --upgrade

Poznámka:

Od května 2024 už rozšíření Azure CLI ve výchozím nastavení nepovolují funkce ve verzi Preview. Pokud chcete získat přístup k funkcím Container Apps ve verzi Preview, nainstalujte rozšíření Container Apps pomocí --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Nyní, když je příslušné rozšíření nebo modul nainstalován, zaregistrujte obory názvů Microsoft.App a Microsoft.OperationalInsights.

Poznámka:

Prostředky Azure Container Apps byly migrovány z jmenného prostoru Microsoft.Web do jmenného prostoru Microsoft.App. Další informace najdete v tématu Migrace oboru názvů z Microsoft.Web na Microsoft.App v březnu 2022.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Vytvoření prostředí Azure Container Apps

Po dokončení nastavení Azure CLI můžete definovat proměnné prostředí, které se používají v tomto článku.

Definujte následující proměnné v prostředí Bash.

export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"

Vytvořte skupinu prostředků.

az group create  \
    --name $RESOURCE_GROUP \
    --location $LOCATION \

Vytvořte prostředí s automaticky vygenerovaným pracovním prostorem služby Log Analytics.

az containerapp env create \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Zobrazí výchozí doménu prostředí kontejnerové aplikace. Poznamenejte si tuto doménu, abyste ji mohli použít v dalších částech.

az containerapp env show \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --query properties.defaultDomain

Příprava aplikace na nasazení

Když nasadíte aplikaci do Azure Container Apps, adresa URL pro přesměrování se změní na adresu URL pro přesměrování nasazené instance aplikace v Azure Container Apps. Pomocí následujícího postupu změňte tato nastavení v souboru application.yml :

  1. Přejděte k souboru src\main\resources\application.yml vaší aplikace a změňte hodnotu post-logout-redirect-uri na doménové jméno vaší nasazené aplikace, jak ukazuje následující příklad. Nezapomeňte nahradit <API_NAME> a <default-domain-of-container-app-environment> vašimi skutečnými hodnotami. Například s výchozí doménou prostředí Azure Container App z předchozího kroku a ms-identity-api jako názvem aplikace použijete https://ms-identity-api.<default-domain> jako hodnotu pro post-logout-redirect-uri.

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  2. Po uložení tohoto souboru pomocí následujícího příkazu znovu sestavte aplikaci:

    mvn clean package
    

Důležité

Soubor application.yml aplikace aktuálně obsahuje hodnotu tajného klíče klienta v parametru client-secret. Tuto hodnotu v tomto souboru není vhodné zachovat. Pokud soubor potvrdíte do úložiště Git, může se stát, že riskujete. Informace o doporučeném postupu najdete v tématu Správa tajných klíčů v Azure Container Apps.

Aktualizace registrace aplikace Microsoft Entra ID

Vzhledem k tomu, že se identifikátor URI přesměrování změní v nasazené aplikaci v Azure Container Apps, musíte také změnit identifikátor URI přesměrování v registraci aplikace Microsoft Entra ID. K provedení této změny použijte následující postup:

  1. Přejděte na stránku Registrace aplikací platformy Microsoft identity pro vývojáře.

  2. Pomocí vyhledávacího pole vyhledejte registraci své aplikace – například java-servlet-webapp-authentication.

  3. Výběrem jejího názvu otevřete registraci aplikace.

  4. Vyberte z nabídky Ověřování.

  5. V části Web - Identifikátory URI přesměrování vyberte Přidat identifikátor URI.

  6. Vyplňte identifikátor URI vaší aplikace a na konec přidejte /login/oauth2/code/ – například https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.

  7. Vyberte Uložit.

Nasazení aplikace

Nasaďte balíček JAR do Azure Container Apps.

Poznámka:

V případě potřeby můžete v proměnných prostředí sestavení Java zadat verzi sady JDK. Další informace najdete v článku Proměnné prostředí sestavení pro Javu v Azure Container Apps.

Nyní můžete nasadit svůj soubor WAR pomocí příkazu az containerapp up CLI.

az containerapp up \
    --name $API_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT \
    --artifact <JAR_FILE_PATH_AND_NAME> \
    --ingress external \
    --target-port 8080 \
    --query properties.configuration.ingress.fqdn

Poznámka:

Výchozí verze sady JDK je 17. Pokud potřebujete změnit verzi JDK, aby byla kompatibilní s vaší aplikací, můžete pomocí argumentu --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> upravit číslo verze.

Další proměnné prostředí pro sestavení najdete v článku Proměnné prostředí pro sestavení pro Javu v Azure Container Apps.

Ověření aplikace

V tomto příkladu příkaz containerapp up obsahuje argument --query properties.configuration.ingress.fqdn, který vrací plně kvalifikovaný název domény (FQDN), také známý jako adresa URL aplikace. Pomocí následujících kroků zkontrolujte protokoly aplikace a prozkoumejte případné problémy s nasazením:

  1. Přejděte na adresu URL výstupní aplikace ze stránky Výstupy v části Nasazení.

  2. V navigačním podokně na stránce Přehled instance služby Azure Container Apps vyberte Protokoly a zkontrolujte protokoly aplikace.

Prozkoumejte ukázku

Ukázku můžete prozkoumat pomocí následujících kroků:

  1. Všimněte si stavu přihlášení nebo odhlášení, který se zobrazuje uprostřed obrazovky.
  2. Vyberte tlačítko citlivé na kontext v rohu. Na tomto tlačítku se při prvním spuštění aplikace zobrazuje Přihlásit se. Případně vyberte podrobnosti o tokenu. Vzhledem k tomu, že je tato stránka chráněná a vyžaduje ověření, budete automaticky přesměrováni na přihlašovací stránku.
  3. Na další stránce postupujte podle pokynů a přihlaste se pomocí účtu v tenantovi Microsoft Entra ID.
  4. Na obrazovce souhlasu si všimněte požadovaných oborů.
  5. Po úspěšném dokončení toku přihlášení byste měli být přesměrováni na domovskou stránku , která zobrazuje stav přihlášení , nebo na stránku s podrobnostmi o tokenu v závislosti na tom, které tlačítko aktivovalo tok přihlášení.
  6. Všimněte si, že na kontextovém tlačítku je nyní Odhlásit se a zobrazuje se na něm vaše uživatelské jméno.
  7. Pokud jste na domovské stránce, vyberte ID Token Details, abyste zobrazili některé dekódované atributy tokenu ID.
  8. Pomocí tlačítka v rohu se odhlaste. Stavová stránka odráží nový stav.

O kódu

Tato ukázka demonstruje, jak pomocí klientské knihovny Microsoft Entra ID Spring Boot Starter pro Javu přihlašovat uživatele k vašemu tenantovi Microsoft Entra ID. Ukázka také využívá startéry Spring OAuth2 Client a Spring Web. Ukázka používá deklarace identity z tokenu ID získaného z ID Microsoft Entra k zobrazení podrobností přihlášeného uživatele.

Obsah

Následující tabulka ukazuje obsah složky ukázkového projektu:

Soubor nebo složka Popis
pom.xml Závislosti aplikací
src/main/resources/templates/ Šablony thymeleaf pro uživatelské rozhraní.
src/main/resources/application.yml Konfigurace aplikace a knihovny Boot Starter pro Microsoft Entra ID.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Tento adresář obsahuje hlavní vstupní bod aplikace, kontroler a třídy konfigurace.
.../MsIdentitySpringBootWebappApplication.java Hlavní třída.
.../SampleController.java Kontroler s mapováním koncových bodů.
.../SecurityConfig.java Konfigurace zabezpečení – například trasy vyžadují ověření.
.../Utilities.java Pomocná třída – například pro filtrování claimů tokenu ID.
CHANGELOG.md Seznam změn v ukázce
CONTRIBUTING.md Pokyny pro přispívání do ukázky
LICENCE Licence pro vzorek.

Deklarace identity tokenů ID

K získání podrobností o tokenu aplikace využívá objekty AuthenticationPrincipal a OidcUser při mapování požadavku, jak ukazuje následující příklad. Úplné podrobnosti o tom, jak tato aplikace využívá deklarace v tokenu ID, najdete v Sample Controlleru.

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

Pro přihlášení aplikace odešle žádost do koncového bodu přihlášení k Microsoft Entra ID automaticky nakonfigurované klientskou knihovnou Spring Boot Starter pro Microsoft Entra ID pro Javu, jak je znázorněno v následujícím příkladu:

<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>

Při odhlášení aplikace odešle požadavek POST na koncový bod logout, jak ukazuje následující příklad:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Prvky uživatelského rozhraní závislé na ověřování

Aplikace má na stránkách šablony uživatelského rozhraní nějakou jednoduchou logiku pro určení obsahu, který se má zobrazit na základě toho, jestli je uživatel ověřený, jak je znázorněno v následujícím příkladu pomocí značek Spring Security Thymeleaf:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

Ochrana tras pomocí AADWebSecurityConfigurerAdapter

Aplikace ve výchozím nastavení chrání stránku podrobností tokenu ID, aby k ní mohli přistupovat jenom přihlášení uživatelé. Aplikace konfiguruje tyto trasy pomocí vlastnosti app.protect.authenticated ze souboru application.yml. Chcete-li nakonfigurovat specifické požadavky vaší aplikace, použijte u instance AadWebApplicationHttpSecurityConfigurer#aadWebApplication metodu HttpSecurity. Příklad najdete ve třídě SecurityConfig této aplikace, jak ukazuje následující kód:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig  {
    
    @Value("${app.protect.authenticated}")
    private String[] allowedOrigins;
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
            .and()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers(allowedOrigins).authenticated()
                .anyRequest().permitAll()
                );
        // @formatter:on
        return http.build();
    }

    @Bean
    @RequestScope
    public ServletUriComponentsBuilder urlBuilder() {
        return ServletUriComponentsBuilder.fromCurrentRequest();
    }    
}

Více informací

Další informace o tom, jak v tomto a dalších scénářích fungují protokoly OAuth 2.0, viz Scénáře ověřování pro Microsoft Entra ID.