Guide Saml
Guide Saml
Guide Saml
Si vous devez utiliser SAML avec Spring Boot, ce screencast devrait le rendre rapide et facile.
**Conditions préalables**:
===
. Pour commencer, vous aurez besoin d'un compte développeur Okta. Vous pouvez en créer un sur
https://developer.okta.com/signup[developer.okta.com/signup] ou installer
https://cli.okta.com[Okta CLI] et exécuter « okta register ».
* Use this for Recipient URL and Destination URL: (the default)
. Sélectionnez **Finish**.
. Scroll down to the **SAML Signing Certificates** and go to **SHA-2** > **Actions** > **View IdP
Metadata**. You can right-click and copy this menu item's link or open its URL. Copy the resulting
link to your clipboard.
. Go to your app's **Assignment** tab and assign access to the **Everyone** group.
===
. Create a Spring Boot app using https://start.spring.io[start.spring.io]. Select the following options:
* Project: *Gradle*
.`HomeController.java`
----
package com.example.demo;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import
org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
model.addAttribute("name", principal.getName());
model.addAttribute("emailAddress", principal.getFirstAttribute("email"));
model.addAttribute("userAttributes", principal.getAttributes());
return "home";
----
Home.html
<!DOCTYPE html>
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity6">
<head>
</head>
<body>
<h1>Welcome</h1>
<dt th:text="${userAttribute.key}"></dt>
<dd th:text="${userAttribute.value}"></dd>
</dl>
</form>
</body>
</html>
----------
Application.yml:
spring:
security:
saml2:
relyingparty:
registration:
okta:
assertingparty:
metadata-uri: <your-metadata-uri>
Mettez à jour `build.gradle` pour ajouter la dépendance SAML de Spring Security :
----
repositories {
...
dependencies {
constraints {
implementation "org.opensaml:opensaml-core:4.1.1"
implementation "org.opensaml:opensaml-saml-api:4.1.1"
implementation "org.opensaml:opensaml-saml-impl:4.1.1"
...
implementation 'org.springframework.security:spring-security-saml2-service-provider'
----
EXPLICATION: la génération d'une clé privée et d'un certificat auto-signé est une pratique
standard pour sécuriser les échanges de messages SAML, y compris les requêtes de logout,
entre votre application Spring Boot et le fournisseur d'identité Okta. Cela contribue à
maintenir la confidentialité, l'intégrité et l'authenticité des communications dans un
environnement SAML.
Répondez à au moins l'une des questions avec une valeur, et cela devrait fonctionner.
(Dans le terminal de IJ)
openssl req -newkey rsa:2048 -nodes -keyout local.key -x509 -days 365 -out local.crt
spring:
security:
saml2:
relyingparty:
registration:
okta:
assertingparty:
...
signing:
credentials:
- private-key-location: classpath:local.key
certificate-location: classpath:local.crt
singlelogout:
binding: POST
response-url: "{baseUrl}/logout/saml2/slo"
5- Upload local.crt vers votre application Okta (Browse files). Selectionner Enable Single
Logout and use the following values:
Cette étape est importante car elle permet d'adapter l'attribution des rôles aux
besoins spécifiques de votre application en exploitant les informations fournies par le
fournisseur d'identité (Okta). Cela donne plus de flexibilité pour gérer les
autorisations des utilisateurs en fonction de leur contexte ou de leur groupe
d'appartenance.
Name: groups (Ce champ spécifie le nom de l'attribut que vous souhaitez récupérer de Okta)
Name format: Unspecified (Ce champ indique le format dans lequel le nom de l'attribut sera
fourni)
Filter: Matches regex and use .* for the value (Ce champ spécifie le filtre qui sera
appliqué aux valeurs de l'attribut récupéré -> ce qui signifie qu'il utilisera une expression régulière
pour correspondre à toutes les valeurs possibles. L'expression régulière .* correspond à n'importe
quelle séquence de caractères.)
Save
3- Créez une classe SecurityConfiguration qui remplace la configuration par
défaut et utilise un convertisseur pour traduire les valeurs dans l'attribut
groups en autorisations de Spring Security.
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider;
import
org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.ResponseT
oken;
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal;
import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@Bean
// Configure le convertisseur qui traduira les valeurs dans l'attribut "groups" en autorisations Spring Security
authenticationProvider.setResponseAuthenticationConverter(groupsConverter());
.anyRequest().authenticated())
.saml2Logout(withDefaults());
return http.build();
// Définit le convertisseur qui traduira les valeurs dans l'attribut "groups" en autorisations Spring Security
OpenSaml4AuthenticationProvider.createDefaultResponseAuthenticationConverter();
if (groups != null) {
// Pour chaque groupe, crée une autorité Spring Security et l'ajoute à la liste des autorités
groups.stream().map(SimpleGrantedAuthority::new).forEach(authorities::add);
} else {
authorities.addAll(authentication.getAuthorities());
// Retourne une nouvelle instance de l'objet Saml2Authentication avec les autorités mises à jour
};