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
y123
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:
<!-- 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) | Requerido | Descripción |
---|---|---|
endpoint | Sí | URL del Servidor Casdoor, como http://localhost:8000 |
clientId | Sí | Application.client_id |
clientSecret | Sí | Application.client_secret |
certificate | Sí | Application.certificate |
organizationName | Sí | Application.organization |
applicationName | No | Application.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
.
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.
Puede ver la plataforma de inicio de sesión unificada de Casdoor.
Después de un inicio de sesión exitoso, será redirigido a la interfaz principal. Ahora puede hacer clic en cualquier botón.
Además
Puede explorar los siguientes proyectos/documentos para aprender más sobre la integración de Java con Casdoor.