Aprendizaje de Spring Security (8): uso de Spring Security OAuth2 para lograr un inicio de sesión único

1. Información general

En este tutorial, discutiremos cómo implementar SSO (inicio de sesión único) usando Spring Security OAuth y Spring Boot.

Este ejemplo usará tres aplicaciones separadas

  • Un servidor de autorización (mecanismo de autenticación central)

  • Dos aplicaciones cliente (aplicaciones que usan SSO)

En pocas palabras, cuando un usuario intenta acceder a una página segura de una aplicación cliente, primero se autentica a través de una redirección del servidor de autenticación.

Usaremos el tipo de concesión de código de autorización de OAuth2 para impulsar la autorización.

2. Solicitud de cliente

Comencemos con la aplicación cliente y usemos Spring Boot para minimizar la configuración:

2.1 Dependencias de Maven

Primero, se deben agregar las siguientes dependencias a pom.xml:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency> 

2.2 Configuración de seguridad

A continuación, la parte más importante es la configuración de seguridad de la aplicación cliente:

@Configuration
@EnableOAuth2Sso
public class UiSecurityConfig extends WebSecurityConfigurerAdapter { @Overridepublic void configure(HttpSecurity http) throws Exception {http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**").permitAll().anyRequest().authenticated();}
} 

Por supuesto, la parte central de esta configuración es la anotación @EnableOAuth2Sso, que usamos para habilitar el inicio de sesión único.

Tenga en cuenta que debemos crear una subclase de WebSecurityConfigurerAdapter; sin ella, todas las rutas estarán protegidas, por lo que los usuarios serán redirigidos a la página de inicio de sesión cuando intenten acceder a cualquier página. En el ejemplo actual, se puede acceder a la página de índice y la página de inicio de sesión sin autenticación.

Finalmente, también definimos un bean RequestContextListener para manejar las solicitudes.

aplicación.yml:

server:port: 8082context-path: /uisession:cookie:name: UISESSION
security:basic:enabled: falseoauth2:client:clientId: SampleClientIdclientSecret: secretaccessTokenUri: http://localhost:8081/auth/oauth/tokenuserAuthorizationUri: http://localhost:8081/auth/oauth/authorizeresource:userInfoUri: http://localhost:8081/auth/user/me
spring:thymeleaf:cache: false 

Hay algunos puntos para explicar :

  • Deshabilitamos la autenticación básica predeterminada

  • accessTokenUri es el URI para obtener el token de acceso

  • userAuthorizationUri es el URI de autorización al que se redirigirá al usuario

  • El punto final del usuario userInfoUri URI se utiliza para obtener los detalles del usuario actual

Además, cabe señalar que en este ejemplo, utilizamos el servidor de autorización creado por nosotros mismos. Por supuesto, también podemos usar el servidor de autorización de otros proveedores externos, como Facebook o GitHub.

2.3 Frontal

Ahora veamos la configuración de front-end de la aplicación cliente. No queremos pasar mucho tiempo aquí, principalmente porque se ha cubierto antes .

La aplicación cliente tiene un front-end muy simple:

índice.html :

<h1>Spring Security SSO</h1>
<a href="securedPage">Login</a> 

páginasegura.html

<h1>Secured Page</h1>
Welcome, <span th:text="${#authentication.name}">Name</span> 

La página securePage.html requiere la autenticación del usuario. Si un usuario no autenticado intenta acceder a securePage.html, primero será redirigido a la página de inicio de sesión.

3. Servidor de autenticación

Ahora comencemos a hablar sobre el servidor de autorización.

3.1 Dependencias de Maven

Primero, define las dependencias en pom.xml:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId>
</dependency> 

3.2 Configuración de OAuth

Es importante entender por qué estamos ejecutando el servidor de autorización y el servidor de recursos juntos como una sola unidad implementable aquí.

Comencemos configurando el servidor de recursos:

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

Después de eso, configure el servidor de autorización:

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;
 @Overridepublic void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}
 @Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("SampleClientId").secret("secret").authorizedGrantTypes("authorization_code").scopes("user_info").autoApprove(true) ; }
 @Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager);}
} 

Tenga en cuenta que usamos el tipo de autorizaciónauthorization_code para iniciar un cliente simple.

3.3 Configuración de seguridad

Primero, deshabilitaremos la autenticación básica predeterminada a través de application.properties:

server.port=8081
server.context-path=/auth
security.basic.enabled=false 

Ahora, vayamos a configuración y definamos un mecanismo de inicio de sesión de formulario simple:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Autowiredprivate AuthenticationManager authenticationManager;
 @Overrideprotected void configure(HttpSecurity http) throws Exception {http.requestMatchers().antMatchers("/login", "/oauth/authorize").and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();}
 @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.parentAuthenticationManager(authenticationManager).inMemoryAuthentication().withUser("john").password("123").roles("USER");}
} 

Tenga en cuenta que, si bien usamos una autenticación simple en memoria, se puede reemplazar fácilmente con un UserDetailsService personalizado.

3.4 Punto final del usuario

Finalmente, crearemos el punto final de usuario que usamos anteriormente en la configuración:

@RestController
public class UserController {@GetMapping("/user/me")public Principal user(Principal principal) {return principal;}
} 

Los datos de usuario se devolverán como JSON.

4. Conclusión

En este breve tutorial, implementamos el inicio de sesión único con Spring Security Oauth2 y Spring Boot.

Como siempre, puede encontrar el código fuente completo en GitHub .

Código de muestra del proyecto original

github.com/eugenp/tuto…

Supongo que te gusta

Origin blog.csdn.net/qq_44005305/article/details/128561170#comments_25802422
Recomendado
Clasificación