Spring Cloud Azure kullanarak REST API'nizin güvenliğini sağlama

Bu öğreticide, Spring Boot uygulamasında Microsoft Entra ID ile REST API korumasını etkinleştirme işlemi gösterilmektedir.

Bu makalede örnek olarak bir anket sistemi kullanılır. Anket sistemi aşağıdaki REST API'leri sağlar:

  • GET /api/survey/question anketi görüntülemek içindir.
  • POST /api/survey anketi doldurmak içindir.
  • GET /api/survey anket sonucunu görüntülemek içindir.

Bu makalede, aşağıdaki gereksinimleri zorunlu kılmak için rol tabanlı erişim denetimi (RBAC) uygulayarak bu API'leri korursunuz:

  • GET /api/survey/question her istek için kullanılabilir.
  • POST /api/survey verilen kapsama sahip SCOPE_Survey.User bir erişim belirteci içeren kimliği doğrulanmış kullanıcı istekleri için kullanılabilir.
  • GET /api/survey kimliği doğrulanmış yönetici kullanıcı istekleri için, SCOPE_Survey.Admin kapsamı tanınmış bir erişim belirteci içerirse kullanılabilir.

Önkoşullar

Önemli

Bu makaledeki adımları tamamlamak için Spring Boot sürüm 2.5 veya üzeri gereklidir.

REST API'yi kaydetme

Web API'nizi Azure portalına kaydetmek için aşağıdaki adımları kullanın.

  1. Azure portalında oturum açın.

  2. Birden çok kiracıya erişiminiz varsa, bir uygulamayı kaydetmek istediğiniz kiracıyı seçmek için Dizin + abonelik filtresini ( ) kullanın.

  3. Microsoft Entra ID bulun ve seçin.

  4. Manage altında Uygulama kayıtları>Yeni kayıt öğesini seçin.

  5. Ad alanına uygulamanız Uygulamanızın kullanıcıları bu adı görebilir ve daha sonra değiştirebilirsiniz.

  6. Desteklenen hesap türleri içinherhangi bir kuruluş dizinindeki Hesaplar'ı seçin.

  7. Uygulamayı kaydetmek için Kaydet'i seçin.

  8. Uygulamaya Genel Bakış sayfasında Uygulama (istemci) kimliği değerini bulun ve daha sonra kullanmak üzere kaydedin. Bu proje için YAML yapılandırma dosyasını yapılandırmak için bu dosyaya ihtiyacınız vardır.

  9. Yönet'ialtında Api'yi kullanıma sunma>Kapsam ekleöğesini seçin. api://{clientId}devam et'i seçerek önerilen Uygulama Kimliği URI'sini () kabul edin ve ardından aşağıdaki bilgileri girin:

    • Kapsam adı olarak Survey.User girin.
    • Kim onaylayabilir? içinYöneticiler ve kullanıcılar'ı seçin.
    • Yönetici onayı görünen adı için girinAccess the survey service as a user..
    • Yönetici onayı açıklamasını girinAllows the users to write data in survey system..
    • Kullanıcı onayı görünen adı için girinAccess the survey service as a user..
    • Kullanıcı onayı açıklaması için girinAllows the users to write data in survey system..
    • Durum için Etkin'i tutun.
    • Kapsam ekle'yi seçin.
  10. Başka bir kapsam eklemek için önceki adımı yineleyin. Kapsam ekle'yi seçtiğinizde aşağıdaki bilgileri girin:

    • Kapsam adı olarak Survey.Admin girin.
    • Kim onaylayabilir? içinYöneticiler ve kullanıcılar'ı seçin.
    • Yönetici onayı görünen adı için girinAccess the survey service as a admin..
    • Yönetici onayı açıklamasını girinAllows the users to view data in survey system..
    • Kullanıcı onayı görünen adı için girinAccess the survey service as a admin..
    • Kullanıcı onayı açıklaması için girinAllows the users to view data in survey system..
    • Durum için Etkin'i tutun.
    • Kapsam ekle'yi seçin.

Spring Cloud Azure Starter Microsoft Entra ID etkinleştirme

Ardından Spring Cloud Azure ile REST API korumasını etkinleştirin.

Güvenlik bağımlılıkları ekleme

Spring Cloud Azure Starter Azure Active Directory modülünü yüklemek için pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin:

  • Spring Cloud Azure Ürün Reçetesi( BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.3.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Uyarı

    Spring Boot 4.0.x kullanıyorsanız, spring-cloud-azure-dependencies sürümünü 7.3.0 olarak ayarladığınızdan emin olun.

    Spring Boot 3.5.x kullanıyorsanız, spring-cloud-azure-dependencies sürümünü 6.4.0 olarak ayarladığınızdan emin olun.

    Spring Boot 3.1.x-3.5.x kullanıyorsanız, spring-cloud-azure-dependencies sürümünü 5.25.0 olarak ayarladığınızdan emin olun.

    Eğer Spring Boot 2.x kullanıyorsanız, spring-cloud-azure-dependencies sürümünü 4.20.0 olarak ayarladığınızdan emin olun.

    Bu Parça Listesi (BOM), <dependencyManagement> bölümünde pom.xml dosyanızda yapılandırılmalıdır. Bu, tüm Spring Cloud Azure bağımlılıklarının aynı sürümü kullanmasını sağlar.

    Bu ürün reçetesi için kullanılan sürüm hakkında daha fazla bilgi için bkz: Hangi Spring Cloud Azure Sürümünü Kullanmalıyım.

  • Spring Cloud Azure Starter Microsoft Entra bileşeni:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Spring Boot Starter OAuth2 Kaynak Sunucusu eki:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    

HTTP isteklerini yetkilendirme

Anket REST API'lerini korumak için aşağıdaki örnekte gösterildiği gibi korumayı etkinleştirmek için ek açıklamayı @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") somut bir kapsam adıyla ekleyin:

import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.LinkedHashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/survey")
public class SurveyController {

    private static final String QUESTION = "Which sports do you like most?";
    private final Map<LocalDateTime, String> surveys = new LinkedHashMap<>();

    @GetMapping(value = "/question", produces = MediaType.APPLICATION_JSON_VALUE)
    public String question() {
        return QUESTION;
    }

    @PostMapping
    @PreAuthorize("hasAuthority('SCOPE_Survey.User')")
    public String addAnswer(@RequestParam("answer") String answer) {
        if (StringUtils.hasText(answer)) {
            surveys.put(LocalDateTime.now(), answer);
            return "succeeded";
        }
        return "Failed";
    }

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasAuthority('SCOPE_Survey.Admin')")
    public Map<LocalDateTime, String> list() {
        return surveys;
    }
}

YAML yapılandırmasını aşağıdaki örnekte gösterildiği gibi güncelleştirin:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: <your-application-ID-of-Api-SurveyService>
        app-id-uri: <your-application-ID-URI-of-Api-SurveyService>

Uyarı

v1.0 belirteçlerinde yapılandırma api'nin istemci kimliğini gerektirirken v2.0 belirteçlerinde istekte istemci kimliğini veya uygulama kimliği URI'sini kullanabilirsiniz. her ikisini de izleyici doğrulamasını düzgün bir şekilde tamamlayacak şekilde yapılandırabilirsiniz.

Azure Spring Apps'e dağıtım yapma

Spring Boot uygulamasını yerel olarak çalıştırdıktan sonra üretime taşıyabilirsiniz. Azure Spring Apps Spring Boot uygulamalarını kod değişikliği olmadan Azure dağıtmayı kolaylaştırır. Hizmet, geliştiricilerin kodlarına odaklanabilmesi için Spring uygulamalarının altyapısını yönetir. Azure Spring Apps kapsamlı izleme ve tanılama, yapılandırma yönetimi, hizmet bulma, CI/CD tümleştirmesi, mavi-yeşil dağıtımlar ve daha fazlasını kullanarak yaşam döngüsü yönetimi sağlar. Daha fazla bilgi için bkz. Quickstart: İlk uygulamanızı Azure Spring Apps'a dağıtma.

Sonraki adımlar

Spring geliştiricileri için AzureSpring Cloud Microsoft Entra ID Örnekleri