Jednostavna pojedinačna prijava s Spring Security OAuth2 (naslijeđeni stog)

1. Pregled

U ovom uputstvu razgovarat ćemo o tome kako implementirati SSO - Single Sign On - pomoću Spring Security OAuth i Spring Boot.

Upotrijebit ćemo tri zasebne aplikacije:

  • Autorizacijski poslužitelj - koji je središnji mehanizam provjere autentičnosti
  • Dvije klijentske aplikacije: aplikacije koje koriste SSO

Jednostavno rečeno, kada korisnik pokuša pristupiti zaštićenoj stranici u klijentskoj aplikaciji, bit će prvo preusmjeren na autentifikaciju putem Authentication Server-a.

I mi ćemo koristiti Kod odobrenja odobri tip iz OAuth2 za pokretanje delegiranja provjere autentičnosti.

Bilješka: ovaj članak koristi nasljeđeni projekt Spring OAuth. Za verziju ovog članka koja koristi novi stog Spring Security 5, pogledajte naš članak Jednostavna jednokratna prijava s Spring Security OAuth2.

2. Klijentska aplikacija

Počnimo s našom klijentskom aplikacijom; mi ćemo, naravno, koristiti Spring Boot da minimiziramo konfiguraciju:

2.1. Ovisnosti Mavena

Prvo, trebat će nam sljedeće ovisnosti u našem 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 proljeće-čizma-starter-majčina dušica org.thymeleaf.extras majčina dušica-dodaci-springsecurity4 

2.2. Konfiguracija sigurnosti

Sljedeći, najvažniji dio, sigurnosna konfiguracija naše klijentske aplikacije:

@Configuration @ EnableOAuth2Sso javne klase UiSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override javna void konfiguracija (HttpSecurity http) baca izuzetak {http.antMatcher ("/ **") .authorizeRequests (). "" "" "" "" "" .permitAll () .anyRequest () .authenticated (); }}

Ključni dio ove konfiguracije je, naravno, @ EnableOAuth2Sso napomena koju koristimo za omogućavanje pojedinačne prijave.

Imajte na umu da moramo proširiti WebSecurityConfigurerAdapter - bez toga će sve staze biti osigurane - pa će korisnici biti preusmjereni da se prijave kada pokušaju pristupiti bilo kojoj stranici. U našem su slučaju ovdje stranice s indeksom i prijavom jedine stranice kojima se može pristupiti bez provjere autentičnosti.

Napokon smo definirali i a RequestContextListener grah za obradu zahtjeva.

I primjena.iml:

poslužitelj: port: 8082 servlet: context-path: / ui session: cookie: name: UISESSION security: basic: enabled: false oauth2: client: clientId: SampleClientId clientSecret: secret accessTokenUri: // localhost: 8081 / auth / oauth / token userAuthorizationUri: // localhost: 8081 / auth / oauth / autorizirajte resurs: userInfoUri: // localhost: 8081 / auth / user / me spring: thymeleaf: cache: false

Nekoliko kratkih napomena:

  • onemogućili smo zadanu osnovnu provjeru autentičnosti
  • accessTokenUri je URI za dobivanje pristupnih tokena
  • userAuthorizationUri je URI autorizacije na koji će korisnici biti preusmjereni
  • userInfoUri URI korisničke krajnje točke za dobivanje trenutnih korisničkih detalja

Također imajte na umu da smo u ovom primjeru uveli naš Autorizacijski poslužitelj, ali naravno možemo koristiti i druge neovisne pružatelje usluga kao što su Facebook ili GitHub.

2.3. Prednji kraj

Sada, pogledajmo front-end konfiguraciju naše klijentske aplikacije. Ovdje se nećemo usredotočiti na to, uglavnom zato što smo to već pokrili na web mjestu.

Naša klijentska aplikacija ovdje ima vrlo jednostavan front-end; ovdje je index.html:

 Prijaviti se

I securedPage.html:

 Dobrodošli, Ime

The securedPage.html stranici trebala je provjera autentičnosti korisnika. Ako neovlašteni korisnik pokuša pristupiti securedPage.html, prvo će biti preusmjereni na stranicu za prijavu.

3. Auth poslužitelj

Sada razgovarajmo o našem Autorizacijskom poslužitelju ovdje.

3.1. Ovisnosti Mavena

Prvo, moramo definirati ovisnosti u našem pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.security.oauth spring-security-oauth2 2.3.3.OSLOBOĐENJE 

3.2. OAuth konfiguracija

Važno je razumjeti da ćemo ovdje zajedno pokrenuti Autorizacijski poslužitelj i Resursni poslužitelj kao jednu jedinicu za raspoređivanje.

Počnimo s konfiguracijom našeg Resursnog poslužitelja - koja je ujedno i naša primarna aplikacija za pokretanje:

@SpringBootApplication @EnableResourceServer javna klasa AuthorizationServerApplication proširuje SpringBootServletInitializer {javna statička void glavna (String [] args) {SpringApplication.run (AuthorizationServerApplication.class, args); }}

Zatim ćemo konfigurirati naš autorizacijski poslužitelj:

@Configuration @EnableAuthorizationServer javna klasa AuthServerConfig proširuje AuthorizationServerConfigurerAdapter {@Autowired privatni BCryptPasswordEncoder passwordEncoder; @Override javna void konfiguracija (AuthorizationServerSecurityConfigurer oauthServer) baca izuzetak {oauthServer.tokenKeyAccess ("allowAll ()") .checkTokenAccess ("isAuthenticated ()"); } @Override javna void konfiguracija (ClientDetailsServiceConfigurer klijenti) baca iznimku {clients.inMemory () .withClient ("SampleClientId") .secret (passwordEncoder.encode ("secret") .authorizedGrantTypes ("auth_code"). ) .autoApprove (true) .redirectUris ("// localhost: 8082 / ui / login", "// localhost: 8083 / ui2 / login"); }}

Primijetite kako omogućujemo samo jednostavnom klijentu pomoću autorizacijski_kod vrsta odobrenja.

Također, imajte na umu kako automatsko odobrenje postavljeno je na true tako da nas ne preusmjeravaju i promoviraju u ručno odobravanje opsega.

3.3. Konfiguracija sigurnosti

Prvo ćemo onemogućiti zadanu osnovnu provjeru autentičnosti putem našeg primjena.svojstva:

server.port = 8081 server.servlet.context-path = / auth

Sada, prijeđimo na konfiguraciju i definirajmo jednostavan mehanizam za prijavu u obrazac:

@Configuration @Order (1) javna klasa SecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {http.requestMatchers () .antMatchers ("/ prijava", "/ oauth / autorizacija"). I (). authiteRequests () .anyRequest (). authenticated () .and () .formLogin (). dozvolaAll (); } @Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca iznimku {auth.inMemoryAuthentication () .withUser ("john") .password (passwordEncoder (). Encode ("123")) .roles ("USER"); } @Bean public BCryptPasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

Imajte na umu da smo koristili jednostavnu autentifikaciju u memoriji, ali je jednostavno možemo zamijeniti prilagođenom userDetailsService.

3.4. Krajnja točka korisnika

Na kraju ćemo stvoriti korisničku krajnju točku koju smo koristili ranije u našoj konfiguraciji:

@RestController javna klasa UserController {@GetMapping ("/ user / me") javni glavni korisnik (Principal principal) {return principal; }}

Naravno, ovo će vratiti korisničke podatke s JSON predstavom.

4. Zaključak

U ovom smo se brzom vodiču usredotočili na implementaciju jedinstvene prijave pomoću Spring Security Oauth2 i Spring Boot.

Kao i uvijek, puni izvorni kod možete pronaći na GitHubu.