Integracja Keycloak z Spring Boot: Uwierzytelnianie, SSO i OAuth2 w aplikacjach Java

W dzisiejszym świecie zapewnienie bezpieczeństwa i właściwego uwierzytelniania użytkowników jest kluczowym aspektem każdej aplikacji internetowej. Integracja solidnego systemu uwierzytelniania i autoryzacji może być czasochłonna i podatna na błędy. W tym miejscu przydaje się Keycloak, rozwiązanie do zarządzania tożsamością i dostępem (IAM) o otwartym kodzie źródłowym. W tym poście na blogu przyjrzymy się, jak zintegrować Keycloak z aplikacjami Spring Boot, aby bezproblemowo obsługiwać uwierzytelnianie i autoryzację.

 Wprowadzenie do integracji Keycloak z aplikacjami Spring Boot

Co to jest Keycloak?

Keycloak to rozwiązanie IAM typu open source opracowane przez firmę Red Hat. Zapewnia gotową obsługę różnych protokołów uwierzytelniania, takich jak OAuth 2.0, OpenID Connect i SAML 2.0, ułatwiając programistom zabezpieczanie aplikacji. Keycloak oferuje również szeroki zakres funkcji, w tym jednokrotne logowanie (SSO), logowanie społecznościowe, federację użytkowników i szczegółową autoryzację. Co więcej, zapewnia przyjazną dla użytkownika konsolę administracyjną, która upraszcza zarządzanie użytkownikami, rolami i uprawnieniami.

Co to jest Spring Boot?

Spring Boot to framework oparty na Javie typu open source opracowany przez firmę Pivotal Software (obecnie część VMware). Ma ona na celu uproszczenie programowania, wdrażania i konserwacji aplikacji Spring poprzez zapewnienie ustawień domyślnych gotowych do produkcji i zminimalizowanie kodu standardowego. Spring Boot oferuje szeroki wachlarz funkcji, takich jak automatyczna konfiguracja, obsługa wbudowanego serwera WWW i uparte podejście do tworzenia aplikacji. Pomaga to programistom w szybkim i wydajnym tworzeniu autonomicznych aplikacji klasy produkcyjnej.

Jak skonfigurować Keycloak do współpracy ze Spring Boot

Zanim zagłębimy się w proces integracji, najpierw skonfigurujmy Keycloak dla naszej aplikacji Spring Boot.

Instalacja i konfiguracja Keycloak krok po kroku

  1. Pobierz najnowszą wersję Keycloak z oficjalnej strony internetowej (https://www.keycloak.org/downloads).
  2. Rozpakuj pobrane archiwum i przejdź do katalogu bin .
  3. Uruchom serwer Keycloak, uruchamiając ./kc.sh go (Linux/Mac) lub kc.bat (Windows).
  4. Otwórz przeglądarkę internetową i uzyskaj dostęp do konsoli administracyjnej Keycloak pod adresem http://localhost:8080/auth/admin.
  5. Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby utworzyć początkowego administratora.

 Tworzenie realmów, klientów i użytkowników w Keycloak

Po skonfigurowaniu Keycloak musimy utworzyć realm, klienta i użytkownika dla naszej aplikacji Spring Boot.

  1. Zaloguj się do konsoli administracyjnej Keycloak przy użyciu poświadczeń administratora.
  2. Kliknij przycisk “Dodaj serwer” i podaj nazwę nowego serwera (np. “SpringBootRealm”).
  3. Kliknij zakładkę “Klienci”, a następnie przycisk “Utwórz”. Podaj identyfikator klienta (np. “spring-boot-app”) i wybierz “openid-connect” jako protokół klienta.
  4. Skonfiguruj ustawienia klienta zgodnie z potrzebami. Na przykład ustaw wartość “Prawidłowe identyfikatory URI przekierowania” na http://localhost:8080/* , aby zezwolić na przekierowanie do aplikacji Spring Boot. Aplikacja Spring Boot powinna zostać wdrożona na innym hoście lub należy zmienić port 8080 dla aplikacji Keycloak lub Spring Boot.
  5. Kliknij zakładkę “Użytkownicy”, a następnie przycisk “Dodaj użytkownika”. Podaj nazwę użytkownika (np. “springuser”) i zakończ proces tworzenia użytkownika, ustawiając hasło i wszelkie wymagane atrybuty.

Teraz, gdy mamy już skonfigurowany i skonfigurowany Keycloak, przejdźmy do integracji go z naszą aplikacją Spring Boot.

Integracja Keycloak z aplikacją Spring Boot – kompletny przewodnik

Konfiguracja Spring Boot do uwierzytelniania z Keycloak

Aby zintegrować Keycloak z naszą aplikacją Spring Boot, musimy dodać wymagane zależności i skonfigurować naszą aplikację tak, aby używała Keycloak do uwierzytelniania i autoryzacji.

Dodawanie zależności Keycloak w Spring Boot (Maven/Gradle)

Dodaj zależność Keycloak Spring Boot Starter do pliku kompilacji projektu. Jeśli na przykład używasz narzędzia Maven, dodaj następującą zależność do pom.xml pliku:

<zależność>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
<version>${keycloak.version}</wersja>
</dependency>

Jeśli używasz narzędzia Gradle, dodaj następującą zależność do build.gradle pliku:

implementacja ‘org.keycloak:keycloak-spring-boot-starter:${keycloak.version}’

Ustawienia Keycloak w Spring Boot – konfiguracja plików

Następnie zaktualizuj plik konfiguracyjny aplikacji Spring Boot (np. application.yml lub application.properties), aby uwzględnić niezbędne właściwości konfiguracyjne Keycloak. Oto przykładowa konfiguracja przy użyciu application.yml:

Maskowanie:
auth-server-url: http://localhost:8080/auth
dziedzina: SpringBootRealm
Zasób: spring-boot-app
klient-publiczny: true
atrybut główny: preferred_username
Ograniczenia bezpieczeństwa:
– authRoles:
-użytkownik
Kolekcje bezpieczeństwa:
-Wzorców:
– “/*”

Ta konfiguracja określa adres URL serwera Keycloak, utworzony wcześniej obszar i klienta oraz role i wzorce adresów URL do zabezpieczenia. Pamiętaj, aby zaktualizować te wartości zgodnie z konkretną konfiguracją maskowania.

Jak zabezpieczyć aplikację Spring Boot przy użyciu Keycloak

Po skonfigurowaniu Keycloak możemy teraz zabezpieczyć naszą aplikację Spring Boot za pomocą funkcji uwierzytelniania i autoryzacji Keycloak.

Ochrona REST API w Spring Boot za pomocą Keycloak

Aby zabezpieczyć punkty końcowe REST w aplikacji Spring Boot, dodaj adnotacje do metod lub klas kontrolera za @PreAuthorize pomocą adnotacji. Ta adnotacja umożliwia określenie wymaganych ról lub uprawnień do uzyskiwania dostępu do określonego punktu końcowego. Na przykład:

@RestController
@RequestMapping(“/api”)
public class ApiController {

@PreAuthorize(“hasRole(‘użytkownik’)”)
@GetMapping(“/secure”)
public ResponseEntity<String> secureEndpoint() {
return ResponseEntity.ok(“Udzielono dostępu do bezpiecznego punktu końcowego.”);
}

@GetMapping(“/public”)
public ResponseEntity<String> publicEndpoint() {
return ResponseEntity.ok(“Dostęp udzielony do publicznego punktu końcowego.”);
}
}

W tym przykładzie /api/secure punkt końcowy wymaga roli “użytkownik”, podczas gdy /api/public punkt końcowy jest dostępny dla każdego.

Jak pobierać dane użytkownika z Keycloak w Spring Boot

Keycloak udostępnia informacje o użytkowniku w ramach kontekstu zabezpieczeń, do którego można uzyskać dostęp z aplikacji Spring Boot. Aby uzyskać dostęp do informacji o użytkowniku, wstrzyknij KeycloakPrincipal metodę or KeycloakAuthenticationToken do kontrolera. Na przykład:

@GetMapping(“/userinfo”)
public ResponseEntity<String> userInfo(Principal principal) {
KeycloakPrincipal<KeycloakSecurityContext> keycloakPrincipal = (KeycloakPrincipal<KeycloakSecurityContext>) główny;
AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken();
Ciąg username = accessToken.getPreferredUsername();
Ciąg email = accessToken.getEmail();
// … Inne informacje o użytkowniku …
return ResponseEntity.ok(“Informacje o użytkowniku: ” + nazwa użytkownika + “, ” + email);
}

W tym przykładzie uzyskujemy dostęp do nazwy użytkownika i adresu e-mail użytkownika z kontekstu zabezpieczeń Keycloak i zwracamy je jako odpowiedź.

Dzięki tym krokom Twoja aplikacja Spring Boot jest teraz zabezpieczona za pomocą zaawansowanych funkcji uwierzytelniania i autoryzacji Keycloak. Możesz dodatkowo dostosować

Single sign-on (SSO) z Keycloak w aplikacjach Spring Boot

Czym jest SSO?

Single Sign-On (SSO) to proces uwierzytelniania, który umożliwia użytkownikom dostęp do wielu aplikacji za pomocą jednego zestawu danych logowania. Dzięki logowaniu jednokrotnemu użytkownicy muszą uwierzytelnić się tylko raz, a następnie mogą uzyskać dostęp do wielu aplikacji bez konieczności ponownego uwierzytelniania.

Implementacja SSO w Keycloak – korzyści i możliwości

Keycloak to doskonały wybór do wdrożenia SSO, ponieważ obsługuje szeroką gamę protokołów i łatwo integruje się z różnymi aplikacjami. W przypadku korzystania z usługi Keycloak jako dostawcy tożsamości można włączyć logowanie jednokrotne dla aplikacji Spring Boot przy minimalnej konfiguracji.

Jak włączyć SSO (Single Sign-On) w Spring Boot z Keycloak

Po skonfigurowaniu Keycloak jako dostawcy tożsamości włączenie logowania jednokrotnego dla aplikacji Spring Boot jest prostym procesem.

Konfiguracja klienta Keycloak do obsługi SSO

Aby włączyć logowanie jednokrotne, musisz odpowiednio skonfigurować ustawienia klienta Keycloak. Upewnij się, że klienci Keycloak dla różnych aplikacji należą do tego samego obszaru i że korzystają z tej samej konfiguracji dostawcy tożsamości.

Konfiguracja SSO po stronie Spring Boot

W aplikacji Spring Boot upewnij się, że właściwości konfiguracyjne Keycloak w pliku konfiguracyjnym aplikacji (np application.yml . lub application.properties) są poprawnie skonfigurowane. Upewnij się, że auth-server-url właściwości i realm wskazują ten sam serwer i obszar Keycloak, który jest używany przez inne aplikacje uczestniczące w procesie logowania jednokrotnego.

Wylogowanie globalne (SSO Logout) z wykorzystaniem Keycloak

Po włączeniu logowania jednokrotnego ważne jest również prawidłowe wylogowanie, aby upewnić się, że użytkownicy są wylogowani ze wszystkich aplikacji, gdy zdecydują się wylogować.

Ustawienie adresu URL wylogowania w Keycloak

W ustawieniach serwera Keycloak skonfiguruj opcję “Wylogowanie z kanału frontowego”, aby włączyć propagację wylogowania do wszystkich aplikacji. To ustawienie gwarantuje, że gdy użytkownik wyloguje się z jednej aplikacji, zostanie wylogowany ze wszystkich aplikacji przy użyciu tej samej sesji maskowania.

Implementowanie wylogowania w Spring Boot

Aby zaimplementować wylogowanie w aplikacji Spring Boot, utwórz punkt końcowy wylogowania, który przekierowuje użytkowników do adresu URL wylogowania Keycloak. Ten adres URL uruchomi proces wylogowania dla wszystkich aplikacji uczestniczących w procesie logowania jednokrotnego. Oto przykład punktu końcowego wylogowania:

@GetMapping(“/logout”)
public String logout(HttpServletRequest request) zgłasza ServletException {
request.logout();
return “przekierowanie:” + keycloakLogoutUrl;
}

W tym przykładzie keycloakLogoutUrl powinien to być adres URL wylogowania Maskowania, który zazwyczaj ma następujący format: http://<keycloak-server>/auth/realms/<realm>/protocol/openid-connect/logout?redirect_uri=<post-logout-redirect-url>. Upewnij się, że zamieniłeś <keycloak-server>, <realm>i <post-logout-redirect-url> na wartości odpowiednie dla konfiguracji Keycloak.

Wykonując te kroki, aplikacje Spring Boot będą teraz obsługiwać funkcję logowania jednokrotnego i wylogowania za pomocą funkcji Keycloak, umożliwiając użytkownikom bezproblemowy dostęp do wielu aplikacji przy użyciu jednego zestawu danych logowania.

Jak zabezpieczyć API Spring Boot przy pomocy OAuth2 i Keycloak

 Keycloak i OAuth2 – jak działa autoryzacja

OAuth2 to szeroko stosowana struktura autoryzacji, która umożliwia aplikacjom delegowanie dostępu do zasobów bez udostępniania ich poświadczeń. Keycloak obsługuje OAuth2 od razu po wyjęciu z pudełka, umożliwiając zabezpieczanie interfejsów API Spring Boot przy użyciu serwera Keycloak jako serwera autoryzacji OAuth2.

Przepływy OAuth2 maskowania

Keycloak obsługuje różne przepływy OAuth2, takie jak przepływ kodu autoryzacji, przepływ niejawny i przepływ poświadczeń klienta. W zależności od wymagań aplikacji możesz wybrać najbardziej odpowiedni przepływ OAuth2, aby zabezpieczyć interfejs API Spring Boot.

Integracja Keycloak z Spring Security

Spring Security to potężna struktura, która upraszcza zabezpieczanie aplikacji Spring Boot. Integrując Keycloak z Spring Security, możesz wykorzystać możliwości obu rozwiązań do zabezpieczenia swoich interfejsów API.

Dodawanie zależności Keycloak

Aby zintegrować Keycloak z Spring Security, musisz dodać wymagane zależności Keycloak do swojego projektu Spring Boot. Można to zrobić, keycloak-spring-boot-starter dodając zależności i keycloak-spring-security-adapter do konfiguracji kompilacji projektu.

Konfigurowanie usługi Spring Security

Po dodaniu zależności Keycloak musisz skonfigurować Spring Security tak, aby używał Keycloak do uwierzytelniania i autoryzacji. Wiąże się to z utworzeniem KeycloakConfig klasy, która rozszerza KeycloakWebSecurityConfigurerAdapter i skonfigurowaniem Spring Security do korzystania z mechanizmów uwierzytelniania i autoryzacji Keycloak.

Oto przykład KeycloakConfig klasy:

j@Configuration
@EnableWebSecurity
klasa publiczna KeycloakConfig extends KeycloakWebSecurityConfigurerAdapter {

Skonfiguruj Spring Security do korzystania z mechanizmu uwierzytelniania Keycloak
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) zgłasza wyjątek {
auth.authenticationProvider(keycloakAuthenticationProvider());
}

Konfigurowanie ustawień HttpSecurity usługi Spring Security
@Override
protected void configure(HttpSecurity http) zgłasza wyjątek {
super.configure(http);
Protokół http
.authorizeRequests()
.antMatchers(“/public/**”).permitAll()
.anyRequest().authenticated()
.oraz()
.logout().logoutUrl(“/wyloguj”).permitAll();
}

Inne metody konfiguracji maski

}

W tym przykładzie publiczne punkty końcowe interfejsu API są dostępne dla wszystkich, podczas gdy wszystkie inne punkty końcowe wymagają uwierzytelniania. Punkt /logout końcowy jest również skonfigurowany tak, aby zezwalał użytkownikom na wylogowanie.

Integrując Keycloak z Spring Security, możesz skorzystać z solidnych funkcji zabezpieczeń oferowanych przez oba rozwiązania, aby skutecznie chronić interfejsy API Spring Boot. Dzięki tej konfiguracji interfejsy API będą zabezpieczone za pomocą protokołu OAuth2, a użytkownicy będą mogli uzyskać do nich dostęp za pomocą funkcji logowania jednokrotnego udostępnianych przez Keycloak.

author avatar
Julia Dudek
A highly skilled and knowledgeable architect with a wealth of experience in the banking industry. I'm passionate about exploring new technologies and I'm well-versed in DevOps tools and processes. I'm a keen understanding of the unique challenges faced by financial institutions, and adept at designing solutions that address these challenges head-on.