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.


$config[zx-auto] not found$config[zx-overlay] not found