Skydda Java Spring Boot-appar med Microsoft Entra-ID
Den här artikeln visar en Java Spring Boot-webbapp som loggar in användare på din Microsoft Entra ID-klientorganisation med hjälp av Microsoft Entra ID Spring Boot Starter-klientbiblioteket för Java. Det använder OpenID Connect-protokollet.
Följande diagram visar appens topologi:
Klientappen använder Microsoft Entra ID Spring Boot Starter-klientbiblioteket för Java för att logga in en användare och hämta en ID-token från Microsoft Entra-ID. ID-token bevisar att användaren autentiseras med Microsoft Entra-ID och gör det möjligt för användaren att komma åt skyddade vägar.
Förutsättningar
- JDK version 17. Det här exemplet har utvecklats på ett system med Java 17, men det kan vara kompatibelt med andra versioner.
- Maven 3
- Java-tilläggspaketet för Visual Studio Code rekommenderas för att köra det här exemplet i Visual Studio Code.
- En Microsoft Entra-ID-klientorganisation. Mer information finns i Hämta en Microsoft Entra-ID-klientorganisation.
- Ett användarkonto i din Microsoft Entra-ID-klientorganisation. Det här exemplet fungerar inte med ett personligt Microsoft-konto. Om du loggade in på Azure-portalen med ett personligt konto och inte har något användarkonto i din katalog måste du därför skapa ett nu.
- Visual Studio Code
- Azure Tools för Visual Studio Code
Rekommendationer
- Viss kunskap om Spring Framework
- Viss kunskap om Linux/OSX-terminalen eller Windows PowerShell
- jwt.ms för att inspektera dina token.
- Fiddler för övervakning av nätverksaktivitet och felsökning.
- Följ Microsoft Entra ID-bloggen för att hålla dig uppdaterad med den senaste utvecklingen.
Konfigurera exemplet
I följande avsnitt visas hur du konfigurerar exempelprogrammet.
Klona eller ladda ned exempellagringsplatsen
Om du vill klona exemplet öppnar du ett Bash-fönster och använder följande kommando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in
Du kan också gå till lagringsplatsen ms-identity-msal-java-samples och sedan ladda ned den som en .zip fil och extrahera den till hårddisken.
Viktigt!
För att undvika sökvägslängdsbegränsningar i Windows rekommenderar vi att du klonar till en katalog nära roten på enheten.
Registrera exempelprogrammen med din Microsoft Entra ID-klientorganisation
Det finns ett projekt i det här exemplet. Följande avsnitt visar hur du registrerar appen med hjälp av Azure-portalen.
Välj den Microsoft Entra-ID-klientorganisation där du vill skapa dina program
Använd följande steg för att välja klientorganisation:
Logga in på Azure-portalen.
Om ditt konto finns i mer än en Microsoft Entra-ID-klient väljer du din profil i hörnet av Azure-portalen och väljer sedan Växla katalog för att ändra sessionen till önskad Microsoft Entra-ID-klientorganisation.
Registrera appen (java-spring-webapp-auth)
Använd följande steg för att registrera appen:
Gå till Azure-portalen och välj Microsoft Entra-ID.
Välj Appregistreringar i navigeringsfönstret och välj sedan Ny registrering.
På sidan Registrera ett program som visas anger du följande programregistreringsinformation:
- I avsnittet Namn anger du ett beskrivande programnamn för visning för användare av appen , till exempel
java-spring-webapp-auth
. - Under Kontotyper som stöds väljer du Endast Konton i den här organisationskatalogen.
- I avsnittet Omdirigerings-URI (valfritt) väljer du Webb i kombinationsrutan och anger följande omdirigerings-URI:
http://localhost:8080/login/oauth2/code/
.
- I avsnittet Namn anger du ett beskrivande programnamn för visning för användare av appen , till exempel
Välj Registrera för att skapa programmet.
På appens registreringssida letar du upp och kopierar värdet program-ID (klient) för senare användning. Du använder det här värdet i appens konfigurationsfil eller filer.
På appens registreringssida väljer du Certifikat och hemligheter i navigeringsfönstret för att öppna sidan där du kan generera hemligheter och ladda upp certifikat.
Under avsnittet Klienthemlighet välj Ny klienthemlighet.
Skriv en beskrivning – till exempel apphemlighet.
Välj en av de tillgängliga varaktigheterna: Om ett år, Om två år eller Aldrig upphör att gälla.
Markera Lägga till. Det genererade värdet visas.
Kopiera och spara det genererade värdet för användning i senare steg. Du behöver det här värdet för kodens konfigurationsfiler. Det här värdet visas inte igen och du kan inte hämta det på något annat sätt. Se därför till att spara den från Azure-portalen innan du navigerar till någon annan skärm eller något annat fönster.
Konfigurera appen (java-spring-webapp-auth) så att den använder din appregistrering
Använd följande steg för att konfigurera appen:
Kommentar
I följande steg ClientID
är samma som Application ID
eller AppId
.
Öppna projektet i din IDE.
Öppna filen src\main\resources\application.yml.
Leta upp platshållaren
Enter_Your_Tenant_ID_Here
och ersätt det befintliga värdet med ditt Klient-ID för Microsoft Entra.Leta upp platshållaren
Enter_Your_Client_ID_Here
och ersätt det befintliga värdet med program-ID:t ellerclientId
appen somjava-spring-webapp-auth
kopierats från Azure-portalen.Leta upp platshållaren
Enter_Your_Client_Secret_Here
och ersätt det befintliga värdet med det värde som du sparade närjava-spring-webapp-auth
du skapade kopierade från Azure-portalen.
Kör exemplet
Följande avsnitt visar hur du distribuerar exemplet till Azure Spring Apps.
Förutsättningar
Om du distribuerar en Azure Spring Apps Enterprise-planinstans för första gången i målprenumerationen läser du avsnittet Krav i Enterprise-plan på Azure Marketplace.
Maven-plugin-program för Azure Spring Apps. Om Maven inte är det utvecklingsverktyg du föredrar kan du läsa följande liknande självstudier som använder andra verktyg:
Förbereda Spring-projektet
Använd följande steg för att förbereda projektet:
Använd följande Maven-kommando för att skapa projektet:
mvn clean package
Kör exempelprojektet lokalt med hjälp av följande kommando:
mvn spring-boot:run
Konfigurera Maven-plugin-programmet
Kör följande kommando i projektets rot för att konfigurera appen med hjälp av Maven-plugin-programmet för Azure Spring Apps:
mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config
I följande lista beskrivs kommandointeraktionerna:
- OAuth2-inloggning: Du måste auktorisera inloggningen till Azure baserat på OAuth2-protokollet.
- Välj prenumeration: Välj det prenumerationslistnummer där du vill skapa din Azure Spring Apps-instans, som standard är den första prenumerationen i listan. Om du vill använda standardnumret trycker du på Retur.
- Ange namnet på Azure Spring Apps: Ange namnet på den spring apps-instans som du vill skapa. Tryck på Retur om du vill använda standardnamnet.
- Ange resursgruppens namn: Ange namnet på den resursgrupp som du vill skapa spring apps-instansen i. Tryck på Retur om du vill använda standardnamnet.
- Skus: Välj den SKU som du vill använda för din spring apps-instans. Om du vill använda standardnumret trycker du på Retur.
- Ange appnamnet (demo): Ange ett appnamn. Om du vill använda standardprojektets artefakt-ID trycker du på Retur.
- Runtimes: Välj den körning som du vill använda för din spring apps-instans. I det här fallet bör du använda standardnumret, så tryck på Retur.
- Exponera offentlig åtkomst för den här appen (boot-for-azure): Tryck på y.
- Bekräfta för att spara alla ovanstående konfigurationer: Tryck på y. Om du trycker på n sparas inte konfigurationen i .pom-filen.
I följande exempel visas utdata från distributionsprocessen:
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-msal-java-samples/4-spring-web-app/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] ------------------------------------------------------------------------
När du har bekräftat dina val lägger plugin-programmet till det nödvändiga plugin-elementet och inställningarna i projektets pom.xml-fil för att konfigurera appen så att den körs i Azure Spring Apps.
Den relevanta delen av pom.xml-filen bör se ut ungefär som i följande exempel:
<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>
Du kan ändra konfigurationerna för Azure Spring Apps direkt i din pom.xml-fil . Några vanliga konfigurationer visas i följande tabell:
Property | Obligatoriskt | Beskrivning |
---|---|---|
subscriptionId |
falskt | Prenumerations-ID:t. |
resourceGroup |
true | Azure-resursgruppen för din Azure Spring Apps-instans. |
clusterName |
true | Azure Spring Apps-klusternamnet. Om du använder en prenumeration och resursgrupp som redan har en Azure Spring Apps-instans distribuerad kan du också använda det här befintliga klustret att distribuera till. |
appName |
true | Namnet på din app i Azure Spring Apps. |
region |
falskt | Den region där azure Spring Apps-instansen ska vara värd. Standardvärdet är eastus . Giltiga regioner finns i Regioner som stöds. |
sku |
falskt | Prisnivån för din Azure Spring Apps-instans. Standardvärdet är Basic , som endast passar för utvecklings- och testmiljöer. |
runtime |
falskt | Konfigurationen av körningsmiljön. Mer information finns i Konfigurationsinformation. |
deployment |
falskt | Distributionskonfigurationen. Mer information finns i Konfigurationsinformation. |
En fullständig lista över konfigurationer finns i referensdokumentationen för plugin-programmet. Alla Azure Maven-plugin-program delar en gemensam uppsättning konfigurationer. De här konfigurationerna finns i Vanliga konfigurationer. Konfigurationer som är specifika för Azure Spring Apps finns i Azure Spring Apps: Konfigurationsinformation.
Se till att spara värdena clusterName
och appName
för senare användning.
Förbereda appen för distribution
När du distribuerar ditt program till Azure Spring Apps ändras omdirigerings-URL:en till omdirigerings-URL:en för din distribuerade appinstans i Azure Spring Apps. Använd följande steg för att ändra de här inställningarna i din application.yml-fil :
Gå till appens src\main\resources\application.yml-fil och ändra värdet
post-logout-redirect-uri
för till den distribuerade appens domännamn, som du ser i följande exempel. Om du till exempel valdecluster-ms-identity-spring-boot-webapp
din Azure Spring Apps-instans i föregående steg ochms-identity-spring-boot-webapp
för ditt appnamn måste du nu användahttps://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io
förpost-logout-redirect-uri
värdet.post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
När du har sparat den här filen använder du följande kommando för att återskapa din app:
mvn clean package
Viktigt!
Den application.yml filen för programmet innehåller för närvarande värdet för din klienthemlighet i parametern client-secret
. Det är inte bra att behålla det här värdet i den här filen. Du kan också ta en risk om du checkar in den på en Git-lagringsplats.
Som ett extra säkerhetssteg kan du lagra det här värdet i Azure Key Vault och läsa in hemligheten från Key Vault för att göra den tillgänglig i ditt program.
Uppdatera din Microsoft Entra ID-appregistrering
Eftersom omdirigerings-URI:n ändras till din distribuerade app i Azure Spring Apps måste du också ändra omdirigerings-URI:n i din Microsoft Entra ID-appregistrering. Gör den här ändringen med hjälp av följande steg:
Gå till sidan Microsoft platforma za identitete för appregistreringar för utvecklare.
Använd sökrutan för att söka efter din appregistrering – till exempel
java-servlet-webapp-authentication
.Öppna appregistreringen genom att välja dess namn.
Markera Autentisering på kommandomenyn.
I avsnittet Omdirigerings-URI:er för webben - väljer du Lägg till URI.
Fyll i URI:n för din app och lägg till
/login/oauth2/code/
– till exempelhttps://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/
.Välj Spara.
Distribuera appen
Använd följande kommando för att distribuera appen:
mvn azure-spring-apps:deploy
I följande lista beskrivs kommandointeraktionen:
- OAuth2-inloggning: Du måste auktorisera inloggningen till Azure baserat på OAuth2-protokollet.
När kommandot har körts kan du se från följande loggmeddelanden att distributionen lyckades:
[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
Verifiera appen
När distributionen är klar får du åtkomst till programmet med url:en för utdataprogrammet. Använd följande steg för att kontrollera appens loggar för att undersöka eventuella distributionsproblem:
Öppna url:en för utdataprogrammet från sidan Utdata i avsnittet Distribution .
I navigeringsfönstret på azure Spring Apps-instansens översiktssida väljer du Loggar för att kontrollera appens loggar.
Utforska exemplet
Använd följande steg för att utforska exemplet:
- Observera den inloggade eller utloggade statusen som visas i mitten av skärmen.
- Välj den sammanhangskänsliga knappen i hörnet. Den här knappen läser Logga in när du först kör appen. Du kan också välja tokeninformation. Eftersom den här sidan är skyddad och kräver autentisering omdirigeras du automatiskt till inloggningssidan.
- På nästa sida följer du anvisningarna och loggar in med ett konto i Microsoft Entra ID-klientorganisationen.
- Observera de omfång som begärs på medgivandeskärmen.
- När inloggningsflödet har slutförts bör du omdirigeras till startsidan – som visar inloggningsstatusen – eller sidan med tokeninformation, beroende på vilken knapp som utlöste inloggningsflödet.
- Observera att den sammanhangskänsliga knappen nu säger Logga ut och visar ditt användarnamn.
- Om du är på startsidan väljer du ID-tokeninformation för att se några av ID-tokens avkodade anspråk.
- Använd knappen i hörnet för att logga ut. Statussidan visar det nya tillståndet.
Om koden
Det här exemplet visar hur du använder Microsoft Entra ID Spring Boot Starter-klientbiblioteket för Java för att logga in användare i din Microsoft Entra-ID-klientorganisation. Exemplet använder även Spring Oauth2-klienten och Spring Web-startstartarna. Exemplet använder anspråk från den ID-token som hämtats från Microsoft Entra-ID:t för att visa information om den inloggade användaren.
Innehåll
I följande tabell visas innehållet i exempelprojektmappen:
Fil/mapp | beskrivning |
---|---|
pom.xml | Programberoenden. |
src/main/resources/templates/ | Thymeleaf-mallar för användargränssnittet. |
src/main/resources/application.yml | Program- och Microsoft Entra ID Boot Starter-bibliotekskonfiguration. |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Den här katalogen innehåller huvudprogrammets startpunkt, styrenhet och konfigurationsklasser. |
.../MsIdentitySpringBootWebappApplication.java | Huvudklass. |
.../SampleController.java | Styrenhet med slutpunktsmappningar. |
.../SecurityConfig.java | Säkerhetskonfiguration – till exempel vilka vägar som kräver autentisering. |
.../Utilities.java | Verktygsklass – till exempel filter-ID-tokenanspråk. |
CHANGELOG.md | Lista över ändringar i exemplet. |
CONTRIBUTING.md | Riktlinjer för att bidra till exemplet. |
LICENS | Licensen för exemplet. |
ID-tokenanspråk
För att extrahera tokeninformation använder appen Spring Securitys AuthenticationPrincipal
och OidcUser
objektet i en begärandemappning, som du ser i följande exempel. Se Exempelkontrollanten för fullständig information om hur den här appen använder ID-tokenanspråk.
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();
}
Inloggnings- och utloggningslänkar
För inloggning skickar appen en begäran till Microsoft Entra ID-inloggningsslutpunkten automatiskt konfigurerad av Microsoft Entra ID Spring Boot Starter-klientbiblioteket för Java, enligt följande exempel:
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
För utloggning gör appen en POST-begäran till logout
slutpunkten, som du ser i följande exempel:
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Autentiseringsberoende gränssnittselement
Appen har lite enkel logik på mallsidorna för användargränssnittet för att bestämma innehåll som ska visas baserat på om användaren autentiseras, som du ser i följande exempel med Hjälp av Spring Security Thymeleaf-taggar:
<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>
Skydda vägar med AADWebSecurityConfigurerAdapter
Som standard skyddar appen sidan Information om ID-token så att endast inloggade användare kan komma åt den. Appen konfigurerar dessa vägar med hjälp app.protect.authenticated
av egenskapen från filen application.yml . Om du vill konfigurera appens specifika krav tillämpar du AadWebApplicationHttpSecurityConfigurer#aadWebApplication
metoden på instansen HttpSecurity
. Ett exempel finns i den här appens SecurityConfig-klass , som visas i följande kod:
@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();
}
}
Mer information
- Microsoft platforma za identitete (Microsoft Entra-ID för utvecklare)
- Översikt över Microsoft Authentication Library (MSAL)
- Snabbstart: Registrera ett program med Microsofts identitetsplattform
- Snabbstart: Konfigurera ett klientprogram för åtkomst till webb-API:er
- Förstå funktioner för medgivande för Microsoft Entra-ID-program
- Förstå användar- och administratörsmedgivande
- Översikt över program- och tjänstobjekt i Microsoft Entra ID
- Nationella moln
- MSAL-kodexempel
- Microsoft Entra ID Spring Boot Starter-klientbibliotek för Java
- Microsoft Authentication Library for Java (MSAL4J)
- MSAL4J Wiki
- ID-token
- Åtkomsttoken i Microsoft platforma za identitete
Mer information om hur OAuth 2.0-protokoll fungerar i det här scenariot och andra scenarier finns i Autentiseringsscenarier för Microsoft Entra-ID.
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för