[JAVA] Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)

Aperçu

Le troisième jour du calendrier de l'avent Keycloak décrit les étapes pour ** déléguer l'authentification pour les applications Web basées sur Spring Boot à Keycloak **. Keycloak dispose d'un adaptateur pour Spring Boot qui facilite la sécurisation des applications Web basées sur Spring Boot. Cela en fait une application Spring Boot sécurisée qui prend en charge le dernier protocole d'authentification ** «OpenID Connect» ** (OIDC).

Une fois liés, les utilisateurs deviendront «l'utilisateur final» d'OIDC, les applications Web basées sur Spring Boot deviendront la «partie de confiance» d'OIDC et Keycloak deviendra le «fournisseur d'ID ouvert» d'OIDC.

env.png

Avant de commencer

Avant de commencer à utiliser ce didacticiel, vous devez terminer la configuration de Keycloak et créer un utilisateur administrateur. Veuillez consulter l'article Keycloak Advent Calendar Day 2 et effectuez ces tâches. De plus, Gradle ou Maven seront utilisés pour créer et lancer l'application Web, veuillez donc installer l'un ou l'autre.

Cette fois, les applications Web basées sur Keycloak et Spring Boot seront construites sur localhost.

Procédure de coopération

La procédure de coopération est la suivante. Une fois cette opération terminée, vérifiez le fonctionnement.

  1. Paramètres de Keycloak --1.1. Créer un royaume --1.2. Création d'un client --1.3. Créer un rôle --1.4. Création d'utilisateurs et attribution de rôles
  2. Créez une application Spring Boot simple --2.1. Créer un modèle d'application avec Spring Initializr --2.2. Création de classes et HTML --2.3. Configuration de la liaison Keycloak de l'application

1.1. Créer un royaume

Avant de créer un royaume, jetons un bref coup d'œil au royaume. ** "Realm" dans Keycloak signifie une plage de regroupement d'utilisateurs, de rôles, de banques de données connectées (LDAP, etc.). ** Les utilisateurs peuvent créer dans le domaine, et la méthode d'authentification, etc. peut être définie pour chaque domaine. Par défaut, il existe un domaine appelé "Master", et tous les royaumes ajoutés par la suite peuvent être inclus et gérés. Le domaine "Master" est le niveau le plus élevé de la hiérarchie des domaines et peut être géré par un super administrateur (le compte administrateur créé lors de la configuration initiale).

realm.png

Vous pouvez utiliser le royaume "Master" pour gérer les utilisateurs, etc., mais en gros, il est recommandé de créer un royaume, donc créez d'abord un royaume. Vous pouvez également supprimer le royaume "Maître".

Accédez à [http: // localhost: 8080 / auth / admin /](http: // localhost: 8080 / auth / admin /) et connectez-vous à la console d'administration Keycloak avec un compte administrateur.

2017-10-29 11.34.Capture d'écran de 04.png

Dans le menu déroulant intitulé Maître dans le coin supérieur gauche, cliquez sur Ajouter un royaume.

2017-11-04 01.03.Capture d'écran de 23.png

La page Ajouter un domaine s'ouvre. Puisque vous créez un nouveau royaume, entrez "demo" dans le nom du royaume et cliquez sur le bouton "Créer".

2017-11-04 01.07.Captures d'écran de 14.png

Lorsque vous créez un royaume, vous serez redirigé vers la page principale de la console de gestion. Le royaume actuel devrait être "démo".

2017-11-04 01.10.Captures d'écran de 35.png

Vous pouvez basculer entre le royaume maître sous votre contrôle et le royaume que vous venez de créer en cliquant sur le menu déroulant dans le coin supérieur gauche.

1.2. Créer un client

Ensuite, créez un client (*). Dans ce cas, le client est la "partie de confiance" définie par OIDC (également appelée "client" dans OAuth 2.0, qui est la base d'OIDC 1.0), et est l'application Spring Boot.

* Pour être précis, créez un profil pour le client. Le client lui-même est créé à l'aide de "Spring Initializr" décrit plus loin.

Cliquez sur Client dans la barre de menu de gauche. L'écran de la liste des clients s'affiche, cliquez donc sur le bouton "Créer".

2017-11-05 20.25.Capture d'écran de 52.png

Tapez "sample-app" et cliquez sur le bouton "Enregistrer".

2017-11-05 20.26.Capture d'écran de 06.png

Entrez http: // localhost: 8081 / hello pour l'URI de redirection valide.

Screenshot from 2017-11-30 21-26-28.png

<! -![Capture d'écran du 05/11/2017 20.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/43869/9f17916d-8ca3-3e59-b85f- ce215ea23c75.png) |

2017-11-05 20.27.Captures d'écran de 19.png

-->

1.3. Créer un rôle

Ensuite, créez un rôle à attribuer à l'utilisateur. Nous le configurerons plus tard afin que seuls les utilisateurs affectés à ce rôle puissent accéder à l'application Spring Boot.

Le rôle

désigne le rôle de l'utilisateur et est utilisé pour identifier le type ou la catégorie de l'utilisateur. Les administrateurs, utilisateurs, gestionnaires, employés, etc. sont des rôles typiques qui existent au sein d'une organisation. Les applications attribuent souvent l'accès à des rôles spécifiques plutôt qu'à des utilisateurs individuels afin que la gestion des utilisateurs ne soit pas difficile. </ td> </ tr> </ table>

Cliquez sur Rôles dans la barre de menus de gauche. L'écran de la liste des rôles s'affiche, cliquez donc sur le bouton "Créer".

2017-11-05 20.34.Capture d'écran de 06.png

Entrez "utilisateur" dans le "Nom du rôle" et cliquez sur le bouton "Enregistrer".

2017-11-05 20.34.Captures d'écran de 29.png

1.4. Création d'utilisateurs et attribution de rôles

Enfin, créez un utilisateur et attribuez un rôle. Cliquez sur Utilisateurs dans la barre de menu de gauche. L'écran de la liste des utilisateurs s'affiche, cliquez donc sur le bouton "Créer".

La page de la liste des utilisateurs s'ouvre. Cliquez sur Ajouter un utilisateur à droite de la liste d'utilisateurs vide.

2017-11-04 01.36.Captures d'écran de 39.png

Saisissez uniquement le nom d'utilisateur requis et cliquez sur le bouton "Enregistrer" pour ouvrir la nouvelle page de gestion des utilisateurs.

2017-11-04 01.38.Captures d'écran de 12.png

Ensuite, définissez le mot de passe du nouvel utilisateur. Cliquez sur l'onglet Informations d'identification.

Après avoir entré le nouveau mot de passe et le mot de passe (confirmation), un bouton rouge "Reset Password" apparaîtra. À ce stade, remplacez «temporaire» par «désactivé». Cela élimine le besoin de changer votre mot de passe la première fois que vous vous connectez.

2017-11-04 11.37.Capture d'écran de 09.png

Cliquez sur le bouton "Réinitialiser le mot de passe" pour réinitialiser votre mot de passe.

Enfin, cliquez sur la balise "Role Mapping" et déplacez ʻuser` sous "Available Roles" vers "Assigned Roles".

2017-11-05 21.48.Capture d'écran de 03.png

Ceci termine les paramètres de Keycloak.

2.1. Créer un modèle d'application avec Spring Initializr

Ensuite, créez une application Spring Boot. Utilisez Spring Initializr pour créer un modèle pour votre application Spring Boot. Veuillez visiter la page Spring Initializr.

2017-11-05 20.42.Captures d'écran de 16.png

Entrez et sélectionnez les éléments suivants comme indiqué dans l'écran ci-dessus, puis cliquez sur le bouton «Générer un projet».

article Définir la valeur
Project Projet Gradle ou Projet Maven
Langue Java
Dependencies Web、Thymeleaf、DevTools、Keycloak
Group com.example
Artifact sample-app

Le fichier compressé sera téléchargé, alors décompressez-le dans un répertoire approprié.

2.2. Créer des classes et du HTML

Commencez par créer du HTML statique pour la première page. Créez un fichier HTML appelé ʻindex.html dans src / main / resources / static / `avec le contenu suivant.

<html>
<head>
    <title>Sample Application</title>
</head>
 <body>
   <h1>Sample Application</h1>
   <a href="/hello">Go to hello page!</a>
 </body>
</html>

Ensuite, créez le contrôleur et l'écran qui seront appelés à partir de cet écran. Le contrôleur doit avoir le contenu suivant dans src / main / java / com / example / sampleapp / avec le nom de fichier HelloController.java.

package com.example.sampleapp;

import java.util.Locale;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
class HelloController {

    @RequestMapping(value = "/hello")
    public ModelAndView hello(HttpSession ses, ModelAndView mav, Locale locale) {
    	mav.setViewName("hello");
        mav.addObject("message", "Hello! Spring Boot and Keycloak!");
        return mav;
    }
    
    @RequestMapping(value = "/logout")
    public String logout(HttpServletRequest request) throws ServletException {
       request.logout();
       return "redirect:/";
    }
}

L'écran appelé depuis ce contrôleur est créé dans src / main / resources / templates / avec un fichier HTML appelé hello.html.

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:with="lang=${#locale.language}" th:lang="${lang}">
<h1>Hello</h1>
<p th:text="${message}" /><br />
<p>
    <a href="/logout">Logout</a>
</p>
</html>

La structure des répertoires est la suivante.

2017-11-05 21.02.14 からのスクリーンショット.png

Ceci termine l'exemple d'application Web.

2.3. Configuration de l'intégration Keycloak pour les applications

Enfin, configurez l'application Web créée pour qu'elle fonctionne avec Keycloak. Ajoutez la définition suivante à / src / main / resources / application.properties.

keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=demo
keycloak.public-client=true
keycloak.resource=sample-app
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/hello/
server.port=8081

Il définit que l'accès à [http: // localhost / hello /](http: // localhost / hello /) et ci-dessous nécessite une authentification, et que l'utilisateur doit avoir le rôle "user". La dernière propriété spécifie que cette application sera écoutée sur le port 8081.

Ceci termine tous les paramètres.

Contrôle de fonctionnement

Vérifions l'opération. Démarrez l'application Web créée par la commande suivante.

Pour Gradle

$ gradle bootRun

Pour Maven

$ mvn spring-boot:run

Lorsque vous accédez à [http: // localhost: 8081](http: // localhost: 8081), vous verrez l'écran suivant.

2017-11-05 22.10.Capture d'écran de 02.png

Cliquez sur le lien «Aller à la page de bonjour!» Pour accéder à l'écran de connexion Keycloak.

2017-11-05 22.04.Capture d'écran de 53.png

Veuillez vous connecter en tant qu'utilisateur créé. Si les paramètres jusqu'à présent sont correctement effectués, l'écran suivant s'affiche.

2017-11-05 22.11.Captures d'écran de 56.png

finalement

Il est très facile de déléguer l'authentification pour les applications Web basées sur Spring Boot à Keycloak de cette manière. Non seulement c'est facile, mais cela implémente également un processus de connexion standard et sécurisé.

J'ai utilisé l'adaptateur Spring Boot cette fois, mais il existe également un adaptateur de sécurité Spring, qui est inclus dans le Spring Boot Keycloak Starter. J'en parlerai à un autre moment (s'il y en a un ...).


Matériel de référence

mark.png

Recommended Posts