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.