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
- Pobierz najnowszą wersję Keycloak z oficjalnej strony internetowej (https://www.keycloak.org/downloads).
- Rozpakuj pobrane archiwum i przejdź do katalogu
bin
. - Uruchom serwer Keycloak, uruchamiając
./kc.sh
go (Linux/Mac) lubkc.bat
(Windows). - Otwórz przeglądarkę internetową i uzyskaj dostęp do konsoli administracyjnej Keycloak pod adresem
http://localhost:8080/auth/admin
. - 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.
- Zaloguj się do konsoli administracyjnej Keycloak przy użyciu poświadczeń administratora.
- Kliknij przycisk “Dodaj serwer” i podaj nazwę nowego serwera (np. “SpringBootRealm”).
- Kliknij zakładkę “Klienci”, a następnie przycisk “Utwórz”. Podaj identyfikator klienta (np. “spring-boot-app”) i wybierz “openid-connect” jako protokół klienta.
- 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. - 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:
<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:
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
:
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:
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:
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:
@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.