Zabezpečení aplikací Spring Boot v Javě pomocí Microsoft Entra ID
Tento článek ukazuje webovou aplikaci Java Spring Boot, která přihlašuje uživatele v tenantovi Microsoft Entra ID pomocí klientské knihovny Microsoft Entra ID Spring Boot Starter pro Javu. Používá protokol OpenID Připojení.
Následující diagram znázorňuje 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
- JDK verze 17. Tato ukázka byla vyvinuta v systému s Javou 17, ale může být kompatibilní s jinými verzemi.
- Maven 3
- Pro spuštění této ukázky v editoru Visual Studio Code se doporučuje sada Java Extension Pack pro Visual Studio Code .
- Tenant Microsoft Entra ID. Další informace naleznete v tématu Získání tenanta Microsoft Entra ID.
- Uživatelský účet v tenantovi Microsoft Entra ID. Tato ukázka nefunguje s osobním účtem Microsoft. Pokud jste se tedy přihlásili k webu Azure Portal pomocí osobního účtu a nemáte ve svém adresáři uživatelský účet, musíte si ho teď vytvořit.
- Visual Studio Code
- Azure Tools for Visual Studio Code
Doporučení
- Znalost spring frameworku
- Znalost terminálu Linux/OSX nebo Windows PowerShellu
- jwt.ms pro kontrolu tokenů.
- Fiddler pro monitorování síťové aktivity a řešení potíží.
- Sledujte blog Microsoft Entra ID a sledujte aktuální informace o nejnovějším vývoji.
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-java-spring-tutorial.git
cd ms-identity-java-spring-tutorial
cd 1-Authentication/sign-in
Případně přejděte do úložiště ms-identity-java-spring-tutorial , stáhněte si ho jako .zip soubor a extrahujte ho na pevný disk.
Důležité
Pokud se chcete vyhnout omezením délky cest ve Windows, doporučujeme klonování do adresáře poblíž kořenového adresáře jednotky.
Registrace ukázkových aplikací v tenantovi Microsoft Entra ID
V této ukázce je jeden projekt. Pokud chcete aplikaci zaregistrovat na webu Azure Portal, můžete postupovat podle ručních kroků konfigurace nebo použít skript PowerShellu. Skript provede následující úlohy:
- Vytvoří aplikace Microsoft Entra ID a související objekty, jako jsou hesla, oprávnění a závislosti.
- Upraví konfigurační soubory projektu.
- Ve výchozím nastavení nastavíte aplikaci, která funguje jenom s účty v adresáři organizace.
Ke spuštění skriptu PowerShellu použijte následující kroky:
Ve Windows otevřete PowerShell a přejděte do kořenového adresáře klonovaného adresáře.
Pomocí následujícího příkazu nastavte zásady spouštění pro PowerShell:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
Ke spuštění konfiguračního skriptu použijte následující příkazy:
cd .\AppCreationScripts\ .\Configure.ps1
Poznámka:
Další způsoby spouštění skriptů jsou popsány ve skriptech pro vytváření aplikací. Skripty také poskytují průvodce automatickou registrací, konfigurací a odebráním aplikací, které vám můžou pomoct ve scénářích CI/CD.
Konfigurace aplikace (java-spring-webapp-auth) pro použití registrace aplikace
Ke konfiguraci aplikace použijte následující postup:
Poznámka:
V následujících krocích ClientID
je stejný jako Application ID
nebo AppId
.
Otevřete projekt v integrovaném vývojovém prostředí (IDE).
Otevřete soubor src\main\resources\application.yml.
Vyhledejte zástupný symbol
Enter_Your_Tenant_ID_Here
a nahraďte existující hodnotu id vašeho tenanta Microsoft Entra.Vyhledejte zástupný symbol
Enter_Your_Client_ID_Here
a nahraďte existující hodnotu ID aplikace neboclientId
java-spring-webapp-auth
aplikace zkopírovanou z webu Azure Portal.Vyhledejte zástupný symbol
Enter_Your_Client_Secret_Here
a nahraďte existující hodnotu hodnotou, kterou jste uložili při vytvářeníjava-spring-webapp-auth
zkopírovaného z webu Azure Portal.
Spuštění ukázky
Následující části ukazují, jak nasadit ukázku do Azure Spring Apps.
Požadavky
Pokud nasazujete instanci plánu Azure Spring Apps Enterprise poprvé v cílovém předplatném, přečtěte si část Požadavky plánu Enterprise na Azure Marketplace.
Modul plug-in Maven pro Azure Spring Apps Pokud maven není vaším upřednostňovaným nástrojem pro vývoj, projděte si následující podobné kurzy, které používají jiné nástroje:
Příprava projektu Spring
Pomocí následujících kroků připravte projekt:
K sestavení projektu použijte následující příkaz Mavenu :
mvn clean package
Spusťte ukázkový projekt místně pomocí následujícího příkazu:
mvn spring-boot:run
Konfigurace modulu plug-in Maven
Spuštěním následujícího příkazu v kořenovém adresáři projektu nakonfigurujte aplikaci pomocí modulu plug-in Maven pro Azure Spring Apps:
mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config
Následující seznam popisuje interakce příkazů:
- Přihlášení OAuth2: Musíte autorizovat přihlášení k Azure na základě protokolu OAuth2.
- Vyberte předplatné: Vyberte číslo seznamu předplatných, ve kterém chcete vytvořit instanci Azure Spring Apps, která je ve výchozím nastavení prvním předplatným v seznamu. Pokud chcete použít výchozí číslo, stiskněte Enter.
- Zadejte název aplikace Azure Spring: Zadejte název instance spring apps, kterou chcete vytvořit. Pokud chcete použít výchozí název, stiskněte Enter.
- Zadejte název skupiny prostředků: Zadejte název skupiny prostředků, ve které chcete vytvořit instanci aplikace Spring. Pokud chcete použít výchozí název, stiskněte Enter.
- Skladové položky: Vyberte skladovou položku, kterou chcete použít pro instanci aplikace Spring. Pokud chcete použít výchozí číslo, stiskněte Enter.
- Zadejte název aplikace (ukázka):Zadejte název aplikace. Pokud chcete použít výchozí ID artefaktu projektu, stiskněte Enter.
- Moduly runtime: Vyberte modul runtime, který chcete použít pro instanci aplikace Spring. V tomto případě byste měli použít výchozí číslo, takže stiskněte Enter.
- Zveřejnění veřejného přístupu pro tuto aplikaci (boot-for-azure): Stiskněte y.
- Potvrďte uložení všech výše uvedených konfigurací: Stiskněte y. Pokud stisknete klávesu n, konfigurace se neuloží do souboru .pom .
Následující příklad ukazuje výstup procesu nasazení:
Summary of properties:
Subscription id : 12345678-1234-1234-1234-123456789101
Resource group name : rg-ms-identity-spring-boot-webapp
Azure Spring Apps name : cluster-ms-identity-spring-boot-webapp
Runtime Java version : Java 11
Region : eastus
Sku : Standard
App name : ms-identity-spring-boot-webapp
Public access : true
Instance count/max replicas : 1
CPU count : 1
Memory size(GB) : 2
Confirm to save all the above configurations (Y/n):
[INFO] Configurations are saved to: /home/user/ms-identity-java-spring-tutorial/1-Authentication/sign-in/pom. xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:57 min
[INFO] Finished at: 2024-02-14T13:50:44Z
[INFO] ------------------------------------------------------------------------
Jakmile potvrdíte volby, modul plug-in přidá do souboru pom.xml projektu požadovaný prvek modulu plug-in a nakonfiguruje aplikaci tak, aby běžela v Azure Spring Apps.
Relevantní část souboru pom.xml by měla vypadat podobně jako v následujícím příkladu:
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-spring-apps-maven-plugin</artifactId>
<version>1.19.0</version>
<configuration>
<subscriptionId>12345678-1234-1234-1234-123456789101</subscriptionId>
<resourceGroup>rg-ms-identity-spring-boot-webapp</resourceGroup>
<clusterName>cluster-ms-identity-spring-boot-webapp</clusterName>
<region>eastus</region>
<sku>Standard</sku>
<appName>ms-identity-spring-boot-webapp</appName>
<isPublic>true</isPublic>
<deployment>
<cpu>1</cpu>
<memoryInGB>2</memoryInGB>
<instanceCount>1</instanceCount>
<runtimeVersion>Java 11</runtimeVersion>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
Konfigurace pro Azure Spring Apps můžete upravit přímo v souboru pom.xml . Některé běžné konfigurace jsou uvedeny v následující tabulce:
Vlastnost | Požadováno | Popis |
---|---|---|
subscriptionId |
false (nepravda) | ID předplatného. |
resourceGroup |
true | Skupina prostředků Azure pro vaši instanci Azure Spring Apps. |
clusterName |
true | Název clusteru Azure Spring Apps Pokud používáte předplatné a skupinu prostředků, které už mají nasazenou instanci Azure Spring Apps, můžete k nasazení použít také tento existující cluster. |
appName |
true | Název aplikace v Azure Spring Apps |
region |
false (nepravda) | Oblast, ve které se má hostovat instance Azure Spring Apps. Výchozí hodnota je eastus . Platné oblasti najdete v tématu Podporované oblasti. |
sku |
false (nepravda) | Cenová úroveň vaší instance Azure Spring Apps. Výchozí hodnota je Basic , která je vhodná pouze pro vývojová a testovací prostředí. |
runtime |
false (nepravda) | Konfigurace prostředí runtime. Další informace najdete v tématu Podrobnosti o konfiguraci. |
deployment |
false (nepravda) | Konfigurace nasazení. Další informace najdete v tématu Podrobnosti o konfiguraci. |
Úplný seznam konfigurací najdete v referenční dokumentaci k modulu plug-in. Všechny moduly plug-in Azure Maven sdílejí společnou sadu konfigurací. Informace o těchto konfiguracích najdete v tématu Běžné konfigurace. Informace o konfiguracích specifických pro Azure Spring Apps najdete v tématu Azure Spring Apps: Podrobnosti konfigurace.
Nezapomeňte uložit stranou clusterName
a appName
hodnoty pro pozdější použití.
Příprava aplikace na nasazení
Když nasadíte aplikaci do Azure Spring Apps, adresa URL pro přesměrování se změní na adresu URL pro přesměrování vaší nasazené instance aplikace v Azure Spring Apps. Pomocí následujícího postupu změňte tato nastavení v souboru application.yml :
Přejděte do souboru src\main\resources\application.yml vaší aplikace a změňte hodnotu
post-logout-redirect-uri
na název domény nasazené aplikace, jak je znázorněno v následujícím příkladu. Pokud jste například v předchozím kroku zvolilicluster-ms-identity-spring-boot-webapp
instanci Azure Spring Apps ams-identity-spring-boot-webapp
jako název aplikace, musíte tuto hodnotu použíthttps://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io
post-logout-redirect-uri
.post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
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. Můžete také riskovat, pokud ho potvrdíte do úložiště Git.
Jako další krok zabezpečení můžete tuto hodnotu uložit ve službě Azure Key Vault a načíst tajný klíč ze služby Key Vault , aby byla dostupná ve vaší aplikaci.
Aktualizace registrace aplikace Microsoft Entra ID
Vzhledem k tomu, že se identifikátor URI přesměrování změní na nasazenou aplikaci v Azure Spring 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:
Přejděte na stránku Microsoft identity platform pro vývojáře Registrace aplikací.
Pomocívyhledávacího
java-servlet-webapp-authentication
Výběrem jejího názvu otevřete registraci aplikace.
Zvolte Ověřování z nabídky příkazů.
V části Identifikátory URI pro přesměrování webu - vyberte Přidat identifikátor URI.
Vyplňte identifikátor URI aplikace a připojte
/login/oauth2/code/
ho ,https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/
například .Zvolte Uložit.
Nasazení aplikace
K nasazení aplikace použijte následující příkaz:
mvn azure-spring-apps:deploy
Následující seznam popisuje interakci s příkazy:
- Přihlášení OAuth2: Musíte autorizovat přihlášení k Azure na základě protokolu OAuth2.
Po spuštění příkazu se zobrazí následující zprávy protokolu, které nasazení proběhlo úspěšně:
[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO] InstanceName:demo-default-x-xxxxxxxxxx-xxxxx Status:Running Reason:null DiscoverStatus:UNREGISTERED
[INFO] InstanceName:demo-default-x-xxxxxxxxx-xxxxx Status:Terminating Reason:null DiscoverStatus:UNREGISTERED
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-demo.azuremicroservices.io
Ověření aplikace
Po dokončení nasazení přejděte k aplikaci pomocí adresy URL výstupní aplikace. Pomocí následujících kroků zkontrolujte protokoly aplikace a prozkoumejte případné problémy s nasazením:
Přejděte na adresu URL výstupní aplikace ze stránky Výstupy v části Nasazení.
V navigačním podokně na stránce Přehled instance Azure Spring Apps vyberte Protokoly a zkontrolujte protokoly aplikace.
Zkoumání ukázky
Ukázku můžete prozkoumat pomocí následujících kroků:
- Všimněte si stavu přihlášení nebo odhlášení, který se zobrazuje uprostřed obrazovky.
- Vyberte tlačítko citlivé na kontext v rohu. Toto tlačítko přečte přihlášení při prvním spuštění aplikace. 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.
- Na další stránce postupujte podle pokynů a přihlaste se pomocí účtu v tenantovi Microsoft Entra ID.
- Na obrazovce souhlasu si všimněte požadovaných oborů.
- 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í.
- Všimněte si, že kontextové tlačítko se teď zobrazuje odhlásit a zobrazit vaše uživatelské jméno.
- Pokud jste na domovské stránce, vyberte podrobnosti tokenu ID a zobrazte některé dekódované deklarace identity tokenu ID.
- Pomocí tlačítka v rohu se odhlaste. Stavová stránka odráží nový stav.
O kódu
Tato ukázka ukazuje, jak používat klientskou knihovnu Microsoft Entra ID Spring Boot Starter pro Javu k přihlášení uživatelů do tenanta Microsoft Entra ID. Ukázka také využívá úvodní sady Spring Oauth2 Client a Spring Web Boot. 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 |
---|---|
AppCreationScripts/ | Skripty pro automatickou konfiguraci registrací aplikací Microsoft Entra ID |
pom.xml | Závislosti aplikací |
src/main/resources/templates/ | Šablony thymeleaf pro uživatelské rozhraní. |
src/main/resources/application.yml | Konfigurace úvodní knihovny spouštění aplikace a 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 | Třída utility – například deklarace identity tokenu ID filtru. |
CHANGELOG.md | Seznam změn v ukázce |
CONTRIBUTING.md | Pokyny pro přispívání do ukázky |
LICENCE | Licence pro ukázku. |
Deklarace identity tokenů ID
K extrahování podrobností o tokenech aplikace používá spring security AuthenticationPrincipal
a OidcUser
objekt v mapování požadavků, jak je znázorněno v následujícím příkladu. Úplné podrobnosti o tom, jak tato aplikace využívá deklarace identity tokenů ID, najdete v ukázkovém kontroleru .
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();
}
Odkazy pro přihlášení a odhlášení
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>
Pro odhlášení aplikace odešle do koncového logout
bodu požadavek POST, jak je znázorněno v následujícím příkladu:
<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 tyto trasy nakonfiguruje pomocí app.protect.authenticated
vlastnosti ze souboru application.yml . Pokud chcete nakonfigurovat specifické požadavky vaší aplikace, použijte AadWebApplicationHttpSecurityConfigurer#aadWebApplication
metodu HttpSecurity
na instanci. Příklad najdete v této třídě SecurityConfig této aplikace, jak je znázorněno v následujícím kódu:
@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í
- Microsoft Identity Platform (Microsoft Entra ID pro vývojáře)
- Přehled knihovny Microsoft Authentication Library (MSAL)
- Rychlý start: registrace aplikace pomocí platformy identity Microsoft
- Rychlý start: Konfigurace klientské aplikace pro přístup k webovým rozhraním API
- Principy prostředí souhlasu aplikace Microsoft Entra ID
- Vysvětlení souhlasu uživatele a správce
- Přehled objektů aplikace a instančního objektu v Microsoft Entra ID
- Národní cloudy
- Ukázky kódu MSAL
- Klientská knihovna Microsoft Entra ID Spring Boot Starter pro Javu
- Microsoft Authentication Library pro Javu (MSAL4J)
- Wikiweb MSAL4J
- Tokeny ID
- Přístupové tokeny na platformě Microsoft Identity Platform
Další informace o fungování protokolů OAuth 2.0 v tomto scénáři a dalších scénářích najdete v tématu Scénáře ověřování pro Microsoft Entra ID.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro