Integrar com Spring Boot

Adicione autenticação OIDC à sua aplicação Spring Boot em minutos usando Spring Security OAuth2 Client.

Spring Security OAuth2 Client
Esta integração usa o fluxo Authorization Code com client secret — adequado para aplicações server-side onde a chave fica no backend. Registre o cliente em sentinel-admin → OAuth2 Clients → New Client.
1

Adicionar dependência Maven

Adicione as dependências do Spring Security OAuth2 Client e do Spring Security ao seu pom.xml. O spring-boot-starter-oauth2-client já inclui o suporte a OpenID Connect e gerencia o ciclo de vida dos tokens automaticamente.

pom.xml
<dependencies>
  <!-- Spring Security -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
  </dependency>

  <!-- OAuth2 Client com suporte a OIDC -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
  </dependency>

  <!-- Web MVC (se ainda não estiver presente) -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

Se você usa Gradle, adicione implementation "org.springframework.boot:spring-boot-starter-oauth2-client" no bloco dependencies do build.gradle.

2

Configurar application.yml

Registre o Sentinel como provedor OIDC nas configurações do Spring. O issuer-uri permite que o Spring descubra automaticamente os endpoints de autorização, token e JWKS via OpenID Connect Discovery.

src/main/resources/application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          sentinel:
            client-id: <SEU_CLIENT_ID>
            client-secret: <SEU_CLIENT_SECRET>
            scope:
              - openid
              - profile
              - email
            redirect-uri: http://localhost:8080/login/oauth2/code/sentinel
            authorization-grant-type: authorization_code
            client-authentication-method: client_secret_basic
        provider:
          sentinel:
            issuer-uri: https://auth.sentinel-identity.com

Substitua <SEU_CLIENT_ID> e <SEU_CLIENT_SECRET> pelos valores gerados em sentinel-admin → OAuth2 Clients → New Client. Nunca commite o client-secret no repositório — use variáveis de ambiente ou um gerenciador de segredos.

3

Configurar o SecurityFilterChain

Crie uma classe de configuração que define quais rotas exigem autenticação, ativa o fluxo de login OIDC e habilita o logout federado (RP-Initiated Logout) para encerrar também a sessão no Sentinel.

src/main/java/com/exemplo/config/SecurityConfig.java
package com.exemplo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/oauth2/authorization/sentinel")
            )
            .logout(logout -> logout
                .logoutSuccessUrl("/")
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .deleteCookies("JSESSIONID")
            );

        return http.build();
    }
}

@EnableMethodSecurity habilita as anotações @PreAuthorize e @PostAuthorize nos controllers e services.

4

Acessar o usuário autenticado

Injete o OidcUser via @AuthenticationPrincipal nos métodos do controller para acessar os claims do token de identidade, como nome, e-mail e subject (sub).

src/main/java/com/exemplo/controller/UserController.java
package com.exemplo.controller;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class UserController {

    @GetMapping("/me")
    public Map<String, Object> currentUser(
            @AuthenticationPrincipal OidcUser oidcUser) {
        return Map.of(
            "sub",   oidcUser.getSubject(),
            "name",  oidcUser.getFullName(),
            "email", oidcUser.getEmail()
        );
    }
}

OidcUser implementa OAuth2User, então você pode usar ambos os tipos como parâmetro. Prefira OidcUser quando precisar de claims OIDC como email_verified.

5

Proteger endpoints com @PreAuthorize

Use @PreAuthorize para controle de acesso declarativo em nível de método. As authorities disponíveis são os scopes do token (prefixados com SCOPE_) e os roles configurados no Sentinel.

src/main/java/com/exemplo/controller/AdminController.java
package com.exemplo.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/admin")
public class AdminController {

    @GetMapping("/dados")
    @PreAuthorize("hasAuthority('SCOPE_profile')")
    public Map<String, Object> dadosProtegidos(
            @AuthenticationPrincipal OidcUser oidcUser) {
        return Map.of(
            "mensagem", "Acesso autorizado",
            "usuario",  oidcUser.getEmail()
        );
    }
}

Para roles customizadas (ex.: ROLE_ADMIN), configure um mapper de claims no sentinel-admin para incluí-las no token como um claim groups ou roles.