Passer au contenu principal

Spring Cloud Gateway

Le casdoor-springcloud-gateway-example est un exemple de comment utiliser le casdoor-spring-boot-starter comme plugin OAuth2 dans Spring Cloud Gateway. Les étapes à suivre sont décrites ci-dessous.

Étape 1 : Déployer Casdoor

Tout d'abord, Casdoor doit être déployé. Vous pouvez vous référer à la documentation officielle de Casdoor pour l'Installation du Serveur. Veuillez déployer votre instance Casdoor en mode production.

Après un déploiement réussi, vous devez vous assurer des points suivants :

  • Ouvrez votre navigateur préféré et visitez http://localhost:8000. Vous verrez la page de connexion de Casdoor.
  • Entrez admin et 123 pour tester si la fonctionnalité de connexion fonctionne correctement.

Après cela, vous pouvez rapidement mettre en œuvre une page de connexion basée sur Casdoor dans votre propre application en suivant les étapes ci-dessous.

Étape 2 : Initialiser un Spring Cloud Gateway

Vous pouvez utiliser directement le code de cet exemple ou le combiner avec votre propre code métier.

Vous avez besoin d'un service de passerelle et d'au moins un service métier. Dans cet exemple, casdoor-gateway est le service de passerelle et casdoor-api est le service métier.

Étape 3 : Inclure la dépendance

Ajoutez la dépendance casdoor-spring-boot-starter à votre projet Spring Cloud Gateway.

Pour 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>

Pour Gradle :

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

Étape 4 : Configurer vos propriétés

L'initialisation nécessite 6 paramètres, tous de type chaîne de caractères.

Nom (dans l'ordre)RequisDescription
endpointOuiURL du serveur Casdoor, comme http://localhost:8000
clientIdOuiApplication.client_id
clientSecretOuiApplication.client_secret
certificateOuiApplication.certificate
organizationNameOuiApplication.organization
applicationNameNonApplication.name

Vous pouvez utiliser des propriétés Java ou des fichiers YAML pour initialiser ces paramètres.

Pour les propriétés :

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

Pour 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

De plus, vous devez configurer le routage de la passerelle. Pour YAML :

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

Étape 5 : Ajouter le CasdoorAuthFilter

Ajoutez une classe d'implémentation de l'interface GlobalFilter à la passerelle pour la vérification de l'identité, comme le CasdoorAuthFilter utilisé dans cet exemple.

Si l'authentification échoue, elle renvoie un code d'état 401 au frontend pour les rediriger vers l'interface de connexion.

@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();
});
}
}

Étape 6 : Obtenir le Service et l'utiliser

Maintenant, fournissez 5 services : CasdoorAuthService, CasdoorUserService, CasdoorEmailService, CasdoorSmsService, et CasdoorResourceService.

Vous pouvez les créer comme suit dans le projet Gateway.

@Resource
private CasdoorAuthService casdoorAuthService;

Lorsque vous avez besoin d'une authentification pour accéder à votre application, vous pouvez envoyer l'URL cible et rediriger vers la page de connexion fournie par Casdoor.

Veuillez vous assurer que vous avez ajouté l'URL de rappel (par exemple, http://localhost:9090/callback) dans la configuration de l'application à l'avance.

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

Après une vérification réussie par Casdoor, vous serez redirigé vers votre application avec un code et un état. Vous pouvez obtenir le code et appeler la méthode getOAuthToken pour analyser le jeton JWT.

CasdoorUser contient les informations de base sur l'utilisateur fournies par Casdoor. Vous pouvez l'utiliser comme mot-clé pour définir la session dans votre application.

@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:/");
});
}

Des exemples des API sont montrés ci-dessous.

  • 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());

Étape 7 : Redémarrer le projet

Après avoir démarré le projet, ouvrez votre navigateur préféré et visitez http://localhost:9090. Ensuite, cliquez sur n'importe quel bouton qui demande des ressources de casdoor-api.

index

La logique d'authentification de la passerelle sera déclenchée. Comme vous n'êtes pas connecté, vous serez redirigé vers l'interface de connexion. Cliquez sur le bouton de connexion.

toLogin

Vous pouvez voir la plateforme de connexion unifiée de Casdoor.

login

Après une connexion réussie, vous serez redirigé vers l'interface principale. Maintenant, vous pouvez cliquer sur n'importe quel bouton.

index-ok

Qui plus est

Vous pouvez explorer les projets/documents suivants pour en savoir plus sur l'intégration de Java avec Casdoor.