Enkel enkelt login med Spring Security OAuth2 (ældre stak)

1. Oversigt

I denne vejledning diskuterer vi, hvordan du implementerer SSO - Single Sign On - ved hjælp af Spring Security OAuth og Spring Boot.

Vi bruger tre separate applikationer:

  • En autorisationsserver - som er den centrale godkendelsesmekanisme
  • To klientapplikationer: applikationerne ved hjælp af SSO

Meget enkelt sagt, når en bruger forsøger at få adgang til en sikret side i klientappen, bliver de omdirigeret til at godkende først via godkendelsesserveren.

Og vi skal bruge Autorisationskode tildel type ud af OAuth2 for at drive delegering af godkendelse.

Bemærk: denne artikel bruger Spring OAuth-arvsprojektet. For versionen af ​​denne artikel, der bruger den nye Spring Security 5-stak, skal du kigge på vores artikel Simple Single Sign-On med Spring Security OAuth2.

2. Klientappen

Lad os starte med vores klientapplikation; Vi bruger selvfølgelig Spring Boot til at minimere konfigurationen:

2.1. Maven afhængigheder

For det første har vi brug for følgende afhængigheder i vores 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. Sikkerhedskonfiguration

Dernæst den vigtigste del, sikkerhedskonfigurationen af ​​vores klientapplikation:

@Configuration @ EnableOAuth2Sso offentlig klasse UiSecurityConfig udvider WebSecurityConfigurerAdapter {@Override public void configure (HttpSecurity http) kaster undtagelse {http.antMatcher ("/ **") .authorizeRequests () .antMatchers ("/", "/ login **" .permitAll () .anyRequest () .authenticated (); }}

Den centrale del af denne konfiguration er selvfølgelig @ EnableOAuth2Sso kommentar, vi bruger til at aktivere Single Sign On.

Bemærk, at vi skal udvide WebSecurityConfigurerAdapter - uden det vil alle stier være sikret - så brugerne omdirigeres til at logge ind, når de prøver at få adgang til en hvilken som helst side. I vores tilfælde her er indeks- og login-siderne de eneste sider, der er adgang til uden godkendelse.

Endelig definerede vi også en RequestContextListener bønne til at håndtere anmodninger rækkevidde.

Og ansøgning.yml:

server: port: 8082 servlet: kontekststi: / ui-session: cookie: navn: UISESSION-sikkerhed: grundlæggende: aktiveret: falsk oauth2: klient: clientId: SampleClientId-klient Hemmelighed: hemmelig adgangTokenUri: // localhost: 8081 / auth / oauth / token userAuthorizationUri: // localhost: 8081 / auth / oauth / authorize resource: userInfoUri: // localhost: 8081 / auth / user / me spring: thymeleaf: cache: false

Et par hurtige noter:

  • vi deaktiverede standard grundlæggende godkendelse
  • accessTokenUri er URI for at få adgangstokens
  • userAuthorizationUri er autorisations-URI, som brugerne omdirigeres til
  • userInfoUri URI for brugerendepunkt for at få aktuelle brugeroplysninger

Bemærk også, at vi i vores eksempel her rullede vores autorisationsserver ud, men selvfølgelig kan vi også bruge andre tredjepartsudbydere som Facebook eller GitHub.

2.3. Frontend

Lad os nu se på front-end-konfigurationen af ​​vores klientapplikation. Vi vil ikke fokusere på det her, primært fordi vi allerede dækkede ind på siden.

Vores klientapplikation her har en meget enkel front-end; her er den index.html:

 Log på

Og securePage.html:

 Velkommen, navn

Det securePage.html side havde brug for, at brugerne blev godkendt. Hvis en ikke-godkendt bruger forsøger at få adgang securePage.html, de bliver omdirigeret til login-siden først.

3. Auth-serveren

Lad os nu diskutere vores autorisationsserver her.

3.1. Maven afhængigheder

Først skal vi definere afhængighederne i vores pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.security.oauth spring-security-oauth2 2.3.3.RELEASE 

3.2. OAuth-konfiguration

Det er vigtigt at forstå, at vi kører autorisationsserveren og ressource-serveren her som en enkelt implementerbar enhed.

Lad os starte med konfigurationen af ​​vores ressource server - som også fungerer som vores primære boot applikation:

@SpringBootApplication @EnableResourceServer offentlig klasse AuthorizationServerApplication udvider SpringBootServletInitializer {public static void main (String [] args) {SpringApplication.run (AuthorizationServerApplication.class, args); }}

Derefter konfigurerer vi vores autorisationsserver:

@Configuration @EnableAuthorizationServer offentlig klasse AuthServerConfig udvider AuthorizationServerConfigurerAdapter {@Autowired private BCryptPasswordEncoder passwordEncoder; @Override offentlig ugyldig konfiguration (AuthorizationServerSecurityConfigurer oauthServer) kaster undtagelse {oauthServer.tokenKeyAccess ("permitAll ()") .checkTokenAccess ("isAuthenticated ()"); } @Override offentlig ugyldig konfiguration (ClientDetailsServiceConfigurer-klienter) kaster undtagelse {clients.inMemory () .withClient ("SampleClientId") .secret (passwordEncoder.encode ("hemmelig")) .authorizedGrantTypes ("autorisationskode") .scopes ("user_info" ) .autoApprove (true) .redirectUris ("// localhost: 8082 / ui / login", "// localhost: 8083 / ui2 / login"); }}

Bemærk, hvordan vi kun aktiverer en simpel klient, der bruger autorisationskode tilskudstype.

Bemærk også hvordan godkend automatisk er sat til sand, så vi ikke omdirigeres og forfremmes til manuelt at godkende anvendelsesområder.

3.3. Sikkerhedskonfiguration

Først deaktiverer vi standard grundlæggende godkendelse via vores application.properties:

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

Lad os nu gå til konfigurationen og definere en simpel form for login-mekanisme:

@Configuration @Order (1) offentlig klasse SecurityConfig udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster Undtagelse {http.requestMatchers () .antMatchers ("/ login", "/ oauth / authorize"). Og (). authorizeRequests () .anyRequest (). godkendt () .and () .formLogin (). permitAll (); } @ Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.inMemoryAuthentication () .withUser ("john"). Adgangskode (passwordEncoder (). Kodning ("123")) .roles ("USER"); } @Bean offentlig BCryptPasswordEncoder passwordEncoder () {returner ny BCryptPasswordEncoder (); }}

Bemærk, at vi brugte simpel autentificering i hukommelsen, men vi kan simpelthen erstatte den med en brugerdefineret userDetailsService.

3.4. Brugerens slutpunkt

Endelig opretter vi vores brugerendepunkt, vi brugte tidligere i vores konfiguration:

@RestController offentlig klasse UserController {@GetMapping ("/ bruger / mig") offentlig Hovedbruger (Hovedhoved) {returhoved; }}

Naturligvis vil dette returnere brugerdataene med en JSON-repræsentation.

4. Konklusion

I denne hurtige vejledning fokuserede vi på implementering af Single Sign-On ved hjælp af Spring Security Oauth2 og Spring Boot.

Som altid kan den fulde kildekode findes på GitHub.