Jednoduché jednotné prihlásenie s Spring Security OAuth2 (starší zásobník)
1. Prehľad
V tomto tutoriáli si ukážeme, ako implementovať SSO - Single Sign On - pomocou Spring Security OAuth a Spring Boot.
Budeme používať tri samostatné aplikácie:
- Autorizačný server - čo je centrálny autentifikačný mechanizmus
- Dve klientske aplikácie: aplikácie využívajúce jednotné prihlásenie
Veľmi zjednodušene povedané, keď sa používateľ pokúsi získať prístup na zabezpečenú stránku v klientskej aplikácii, bude presmerovaný na autentifikáciu ako prvý, prostredníctvom autentifikačného servera.
A my použijeme autorizačný kód typ grantu z OAuth2 na riadenie delegovania autentifikácie.
Poznámka: tento článok využíva starší projekt Spring OAuth. Verziu tohto článku, ktorá používa nový zásobník Spring Security 5, nájdete v našom článku Jednoduché jednotné prihlásenie pomocou protokolu Spring Security OAuth2.
2. Klientská aplikácia
Začnime s našou klientskou aplikáciou; na minimalizáciu konfigurácie samozrejme použijeme Spring Boot:
2.1. Maven závislosti
Najprv budeme potrebovať nasledujúce závislosti v našom pom.xml:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure 2.0.1.RELEASE org.springframework.boot spring-boot-starter-thymeleaf org.thymeleaf.extras thymeleaf-extras-springsecurity4
2.2. Konfigurácia zabezpečenia
Najdôležitejšou časťou je konfigurácia zabezpečenia našej klientskej aplikácie:
@Configuration @ EnableOAuth2Sso verejná trieda UiSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override public void configure (HttpSecurity http) vyvolá výnimku {http.antMatcher ("/ **") .authorizeRequests () .antMatchers ("/", "/ login **") .permitAll () .anyRequest () .authenticated (); }}
Jadrom tejto konfigurácie je samozrejme @ EnableOAuth2Sso anotáciu, ktorú používame na povolenie jednotného prihlásenia.
Upozorňujeme, že musíme rozšíriť WebSecurityConfigurerAdapter - bez nej budú všetky cesty zabezpečené - takže používatelia budú pri pokuse o prístup na ktorúkoľvek stránku presmerovaní na prihlásenie. V našom prípade tu sú indexové a prihlasovacie stránky jediné stránky, na ktoré je možné pristupovať bez autentifikácie.
Nakoniec sme definovali aj a RequestContextListener fazuľa na vybavenie rozsahov požiadaviek.
A aplikácia.yml:
server: port: 8082 servlet: kontextová cesta: / ui relácia: cookie: meno: UISESSION bezpečnosť: základné: povolené: false oauth2: klient: clientId: SampleClientId clientSecret: tajný accessTokenUri: // localhost: 8081 / auth / oauth / token userAuthorizationUri: // localhost: 8081 / auth / oauth / autorizovať zdroj: userInfoUri: // localhost: 8081 / auth / user / me spring: thymeleaf: cache: false
Niekoľko rýchlych poznámok:
- deaktivovali sme predvolené základné overenie
- accessTokenUri je URI na získanie prístupových tokenov
- userAuthorizationUri je autorizačný URI, na ktorý budú používatelia presmerovaní
- userInfoUri URI koncového bodu používateľa na získanie podrobností o aktuálnom používateľovi
Upozorňujeme tiež, že v našom príklade tu sme zaviedli náš autorizačný server, ale samozrejme môžeme použiť aj iných poskytovateľov tretích strán, ako sú Facebook alebo GitHub.
2.3. Frontend
Poďme sa teraz pozrieť na front-endovú konfiguráciu našej klientskej aplikácie. Na toto sa tu nebudeme sústrediť, hlavne preto, že sme sa už na stránke zaoberali.
Naša klientská aplikácia má veľmi jednoduché klientske rozhranie; tu je index.html:
Prihlásiť sa
A securePage.html:
Vitajte, meno
The securePage.html stránka vyžadovala autentifikáciu používateľov. Ak sa neoverený používateľ pokúsi o prístup securePage.html, najskôr budú presmerovaní na prihlasovaciu stránku.
3. Auth server
Teraz tu poďme diskutovať o našom autorizačnom serveri.
3.1. Maven závislosti
Najskôr si musíme definovať závislosti v našom pom.xml:
org.springframework.boot spring-boot-starter-web org.springframework.security.oauth spring-security-oauth2 2.3.3.RELEASE
3.2. Konfigurácia OAuth
Je dôležité si uvedomiť, že tu budeme prevádzkovať autorizačný server a zdrojový server ako jednu nasaditeľnú jednotku.
Začnime s konfiguráciou nášho Resource Servera, ktorý slúži aj ako naša primárna bootovacia aplikácia:
@SpringBootApplication @EnableResourceServer verejná trieda AuthorizationServerApplication rozširuje SpringBootServletInitializer {public static void main (String [] args) {SpringApplication.run (AuthorizationServerApplication.class, args); }}
Potom nakonfigurujeme náš autorizačný server:
@Configuration @EnableAuthorizationServer verejná trieda AuthServerConfig rozširuje AuthorizationServerConfigurerAdapter {@Autowired private BCryptPasswordEncoder hesloEncoder; @Override public void configure (AuthorizationServerSecurityConfigurer oauthServer) hodí výnimku {oauthServer.tokenKeyAccess ("permitAll ()") .checkTokenAccess ("isAuthenticated ()"); } @Override public void configure (klienti ClientDetailsServiceConfigurer) hodí výnimku {clients.inMemory () .withClient ("SampleClientId") .secret (passwordEncoder.encode ("secret")) .authorizedGrantTypes ("authorized_code") .scopes ("user_info") ) .autoApprove (true) .redirectUris ("// localhost: 8082 / ui / login", "// localhost: 8083 / ui2 / login"); }}
Všimnite si, ako povoľujeme iba jednoduchého klienta pomocou autorizačný kód typ grantu.
Všimnite si tiež ako autoApprove je nastavené na hodnotu true, aby sme neboli presmerovaní a povýšení na manuálne schvaľovanie akýchkoľvek rozsahov.
3.3. Konfigurácia zabezpečenia
Najskôr deaktivujeme predvolené základné overenie pomocou našej adresy application.properties:
server.port = 8081 server.servlet.context-path = / autor
Poďme teraz na konfiguráciu a definujme jednoduchý mechanizmus prihlásenia do formulára:
@Configuration @Order (1) verejná trieda SecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvolá výnimku {http.requestMatchers () .antMatchers ("/ login", "/ oauth / authorize") .and (). authorizeRequests () .anyRequest (). authenticated (). a () .formLogin (). permitAll (); } @Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {auth.inMemoryAuthentication () .withUser ("john") .password (passwordEncoder (). Encode ("123")) .roles ("USER"); } @Bean public BCryptPasswordEncoder passwordEncoder () {vrátiť nový BCryptPasswordEncoder (); }}
Upozorňujeme, že sme použili jednoduché overenie v pamäti, ale môžeme ho jednoducho nahradiť zvykom userDetailsService.
3.4. Koncový bod používateľa
Nakoniec vytvoríme náš koncový bod používateľa, ktorý sme použili skôr v našej konfigurácii:
@RestController public class UserController {@GetMapping ("/ user / me") public Principal user (Principal principal) {return principal; }}
Prirodzene to vráti užívateľské údaje so zastúpením JSON.
4. Záver
V tomto rýchlom výučbe sme sa zamerali na implementáciu Single Sign-On pomocou Spring Security Oauth2 a Spring Boot.
Celý zdrojový kód nájdete ako vždy na GitHub.