Saltar al contenido principal

Spring Cloud Gateway

El casdoor-springcloud-gateway-example es un ejemplo de cómo usar el casdoor-spring-boot-starter como un plugin OAuth2 en Spring Cloud Gateway. Los pasos para usarlo se describen a continuación.

Paso 1: Desplegar Casdoor

Primero, Casdoor debe ser desplegado. Puede referirse a la documentación oficial de Casdoor para la Instalación del Servidor. Por favor, despliegue su instancia de Casdoor en modo de producción.

Después de un despliegue exitoso, necesita asegurarse de lo siguiente:

  • Abra su navegador favorito y visite http://localhost:8000. Verá la página de inicio de sesión de Casdoor.
  • Ingrese admin y 123 para probar si la funcionalidad de inicio de sesión está funcionando correctamente.

Después de eso, puede implementar rápidamente una página de inicio de sesión basada en Casdoor en su propia aplicación utilizando los siguientes pasos.

Paso 2: Inicializar un Spring Cloud Gateway

Puede usar el código de este ejemplo directamente o combinarlo con su propio código empresarial.

Necesita un servicio de puerta de enlace y al menos un servicio empresarial. En este ejemplo, casdoor-gateway es el servicio de puerta de enlace y casdoor-api es el servicio empresarial.

Paso 3: Incluir la dependencia

Añada la dependencia casdoor-spring-boot-starter a su proyecto de Spring Cloud Gateway.

Para Apache Maven:

/casdoor-gateway/pom.xml
<!-- https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter -->
<dependency>
<groupId>org.casbin</groupId>
<artifactId>casdoor-spring-boot-starter</artifactId>
<version>1.x.y</version>
</dependency>

Para Gradle:

// https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter
implementation group: 'org.casbin', name: 'casdoor-spring-boot-starter', version: '1.x.y'

Paso 4: Configurar sus propiedades

La inicialización requiere 6 parámetros, todos los cuales son de tipo string.

Nombre (en orden)RequeridoDescripción
endpointURL del Servidor Casdoor, como http://localhost:8000
clientIdApplication.client_id
clientSecretApplication.client_secret
certificateApplication.certificate
organizationNameApplication.organization
applicationNameNoApplication.name

Puede usar propiedades de Java o archivos YAML para inicializar estos parámetros.

Para propiedades:

casdoor.endpoint=http://localhost:8000
casdoor.clientId=<client-id>
casdoor.clientSecret=<client-secret>
casdoor.certificate=<certificate>
casdoor.organizationName=built-in
casdoor.applicationName=app-built-in

Para YAML:

casdoor:
endpoint: http://localhost:8000
client-id: <client-id>
client-secret: <client-secret>
certificate: <certificate>
organization-name: built-in
application-name: app-built-in

Además, necesita configurar el Enrutamiento de la Puerta de Enlace. Para YAML:

spring:
application:
name: casdoor-gateway
cloud:
gateway:
routes:
- id: api-route
uri: http://localhost:9091
predicates:
- Path=/api/**

Paso 5: Añadir el CasdoorAuthFilter

Añada una clase de implementación de la interfaz GlobalFilter a la puerta de enlace para la verificación de identidad, como el CasdoorAuthFilter utilizado en este ejemplo.

Si la autenticación falla, devuelve un código de estado 401 al frontend para redirigirlos a la interfaz de inicio de sesión.

@Component
public class CasdoorAuthFilter implements GlobalFilter, Ordered {

private static final Logger LOGGER = LoggerFactory.getLogger(CasdoorAuthFilter.class);

@Override public int getOrder() {
return 0;
}

@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return exchange.getSession().flatMap(webSession -> {
CasdoorUser user = webSession.getAttribute("casdoorUser");
if (user != null) {
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json");
return response.setComplete();
});
}
}

Paso 6: Obtener el Servicio y usarlo

Ahora proporciona 5 servicios: CasdoorAuthService, CasdoorUserService, CasdoorEmailService, CasdoorSmsService y CasdoorResourceService.

Puede crearlos de la siguiente manera en el proyecto de la Puerta de Enlace.

@Resource
private CasdoorAuthService casdoorAuthService;

Cuando requiera autenticación para acceder a su aplicación, puede enviar la URL objetivo y redirigir a la página de inicio de sesión proporcionada por Casdoor.

Por favor, asegúrese de haber agregado la URL de callback (por ejemplo, http://localhost:9090/callback) en la configuración de la aplicación con antelación.

@RequestMapping("login")
public Mono<String> login() {
return Mono.just("redirect:" + casdoorAuthService.getSigninUrl("http://localhost:9090/callback"));
}

Después de una verificación exitosa por Casdoor, será redirigido de vuelta a su aplicación con un código y estado. Puede obtener el código y llamar al método getOAuthToken para analizar el token JWT.

CasdoorUser contiene la información básica sobre el usuario proporcionada por Casdoor. Puede usarlo como una palabra clave para configurar la sesión en su aplicación.

@RequestMapping("callback")
public Mono<String> callback(String code, String state, ServerWebExchange exchange) {
String token = "";
CasdoorUser user = null;
try {
token = casdoorAuthService.getOAuthToken(code, state);
user = casdoorAuthService.parseJwtToken(token);
} catch(CasdoorAuthException e) {
e.printStackTrace();
}
CasdoorUser finalUser = user;
return exchange.getSession().flatMap(session -> {
session.getAttributes().put("casdoorUser", finalUser);
return Mono.just("redirect:/");
});
}

Ejemplos de las APIs se muestran a continuación.

  • CasdoorAuthService
    • String token = casdoorAuthService.getOAuthToken(code, "app-built-in");
    • CasdoorUser casdoorUser = casdoorAuthService.parseJwtToken(token);
  • CasdoorUserService
    • CasdoorUser casdoorUser = casdoorUserService.getUser("admin");
    • CasdoorUser casdoorUser = casdoorUserService.getUserByEmail("admin@example.com");
    • CasdoorUser[] casdoorUsers = casdoorUserService.getUsers();
    • CasdoorUser[] casdoorUsers = casdoorUserService.getSortedUsers("created_time", 5);
    • int count = casdoorUserService.getUserCount("0");
    • CasdoorResponse response = casdoorUserService.addUser(user);
    • CasdoorResponse response = casdoorUserService.updateUser(user);
    • CasdoorResponse response = casdoorUserService.deleteUser(user);
  • CasdoorEmailService
    • CasdoorResponse response = casdoorEmailService.sendEmail(title, content, sender, receiver);
  • CasdoorSmsService
    • CasdoorResponse response = casdoorSmsService.sendSms(randomCode(), receiver);
  • CasdoorResourceService
    • CasdoorResponse response = casdoorResourceService.uploadResource(user, tag, parent, fullFilePath, file);
    • CasdoorResponse response = casdoorResourceService.deleteResource(file.getName());

Paso 7: Reiniciar el proyecto

Después de iniciar el proyecto, abra su navegador favorito y visite http://localhost:9090. Luego haga clic en cualquier botón que solicite recursos de casdoor-api.

índice

La lógica de autenticación de la puerta de enlace se activará. Dado que no ha iniciado sesión, será redirigido a la interfaz de inicio de sesión. Haga clic en el botón de Inicio de Sesión.

toLogin

Puede ver la plataforma de inicio de sesión unificada de Casdoor.

login

Después de un inicio de sesión exitoso, será redirigido a la interfaz principal. Ahora puede hacer clic en cualquier botón.

index-ok

Además

Puede explorar los siguientes proyectos/documentos para aprender más sobre la integración de Java con Casdoor.