Spring Secuirty simple création de projet et analyse de l'interaction de communication entre le navigateur et le serveur basé sur la capture de wirehark
- 1. Environnement
- 2. Créez un projet de sécurité Spring simple
- 2.4 Configurer le nom d'utilisateur et le mot de passe d'authentification HTTP via le fichier de configuration
- Analyse de capture de paquets à 3 fils
-
- 3.1. Demande de client Round 1, connexion de redirection de serveur
- 3.2. Round 2, le client redirige la demande et le serveur répond à la page de connexion
- 3.3 Le client client Round 3 remplit la connexion et l'authentification du serveur
- 3.4. Demande de redirection du client Round 4 (cookie transportant des informations authentifiées), contenu de la réponse du serveur
- 4 Post-scriptum
1. Environnement
Suite d'outils Spring: Version: 4.1.2.RELEASE Outil de développement intégré
Maven: 3.5.4 Outil de gestion des dépendances
Springboot: 2.1.4. RELEASE
Wireshark: Version 2.4.5 Outil d'analyse de capture de paquets de protocole de communication
Éditeur de requête HTTP: requête HTTP V1.0 Outil de simulation
Google Chrome: 74.0.3729.169 (version officielle) (32 bits) Navigateur Google
Microsoft Edge: 44.18362.329.0 Navigateur Microsoft
2. Créez un projet de sécurité Spring simple
2.1. Assistant pour créer un projet
Remarque: Veuillez sélectionner 2.1.4 pour cette étape, sinon il peut y avoir une erreur dans la première ligne de pom.xml.
Après avoir cliqué, la barre d'état affichera le modèle de téléchargement et la progression de la génération du squelette du projet
Vérifiez pom.xml et voyez que les dépendances suivantes sont automatiquement introduites:
Parmi elles, les deux dépendances liées à secuirty sont:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
2.2 Créer une méthode de contrôleur simple
@RestController
@SpringBootApplication
public class Springsecuritytest001Application {
@GetMapping("/")
public String hello(){
return "hello, spring security";
}
public static void main(String[] args) {
SpringApplication.run(Springsecuritytest001Application.class, args);
}
}
Ajouter l'API rest à la classe Springsecuritytest001Application créée automatiquement
@GetMapping("/")
public String hello(){
return "hello, spring security";
}
Et ajoutez l'annotation
@RestController au niveau de la classe
2.3. Essai de fonctionnement
La console générera le mot de passe de l'utilisateur par défaut (utilisateur) de http.
Utilisez un navigateur pour visiter 127.0.0.1:8080, et elle passera à la page de connexion.
Utilisez le nom d'utilisateur utilisateur et le mot de passe aléatoire imprimé sur la console avant pour le remplir, puis cliquez sur connexion
2.4 Configurer le nom d'utilisateur et le mot de passe d'authentification HTTP via le fichier de configuration
Ajoutez
spring.security.user.name = test
spring.security.user.password = 123456
au fichier application.properties et réexécutez. À ce stade , la console ne générera plus de mots de passe aléatoires.
Accès au navigateur:
Analyse de capture de paquets à 3 fils
Comme vous pouvez le voir, il y a 4 séries de demandes et de réponses
3.1. Demande de client Round 1, connexion de redirection de serveur
Demande du client (http://127.0.0.1:8080):
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Le serveur répond aux instructions de redirection (http://127.0.0.1:8080/login, définissez le champ d'en-tête de requête JSESSIONID):
HTTP/1.1 302
Set-Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://127.0.0.1:8080/login
Content-Length: 0
Date: Mon, 23 Sep 2019 03:31:48 GMT
3.2. Round 2, le client redirige la demande et le serveur répond à la page de connexion
Demande du client (http://127.0.0.1:8080/login):
GET /login HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5
Réponse du serveur (page de remplissage du formulaire d'authentification):
HTTP/1.1 200
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Length: 1406
Date: Mon, 23 Sep 2019 03:31:48 GMT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Please sign in</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous"/>
</head>
<body>
<div class="container">
<form class="form-signin" method="post" action="/login">
<h2 class="form-signin-heading">Please sign in</h2>
<p>
<label for="username" class="sr-only">Username</label>
<input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus>
</p>
<p>
<label for="password" class="sr-only">Password</label>
<input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
</p>
<input name="_csrf" type="hidden" value="2a565ff3-f23f-441c-835c-668603d2e806" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>
</div>
</body></html>
3.3 Le client client Round 3 remplit la connexion et l'authentification du serveur
Lorsque nous remplissons le nom d'utilisateur et le mot de passe, cliquez sur le bouton de connexion
Demande du client (accès: http://127.0.0.1:8080/login, les paramètres de la demande portent les champs du nom d'utilisateur et du mot de passe, et la chaîne aléatoire _csrf générée par le client)
POST /login HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 72
Cache-Control: max-age=0
Origin: http://127.0.0.1:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:8080/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5
username=test&password=123456&_csrf=2a565ff3-f23f-441c-835c-668603d2e806
La réponse du serveur (continuez à rediriger vers http://127.0.0.1:8080/ et mettez à jour le champ JSESSIONID dans l'en-tête de la requête):
HTTP/1.1 302
Set-Cookie: JSESSIONID=D11354A13F7D0706F85900B7017F42B4; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://127.0.0.1:8080/
Content-Length: 0
Date: Mon, 23 Sep 2019 03:32:05 GMT
3.4. Demande de redirection du client Round 4 (cookie transportant des informations authentifiées), contenu de la réponse du serveur
Demande du client (127.0.0.1:8080, transportant le cookie: JSESSIONID)
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:8080/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D11354A13F7D0706F85900B7017F42B4
Réponse du serveur (contenu de 127.0.0.1:8080):
HTTP/1.1 200
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Length: 22
Date: Mon, 23 Sep 2019 03:32:05 GMT
hello, spring security
4 Post-scriptum
1. Voici un comportement logique pour l'apprentissage et la compréhension de certaines fonctions du cadre du point de vue de l'interaction de communication Il faut dire que WireShark est vraiment un outil d'analyse de la communication.
2. Spring security5 a quelques ajustements par rapport à la version précédente. Lors de la lecture de certains livres, les utilisations antérieures à la version 5.0 peuvent être utilisées dans les livres, et diverses anomalies peuvent être signalées lors de l'utilisation de la version supérieure, et certains ajustements doivent être apportés.