Skip to content
Snippets Groups Projects
Verified Commit add85b6f authored by Julien Wittouck's avatar Julien Wittouck
Browse files

:sparkles: : add some more instructions on oidc

parent 92064f66
No related branches found
No related tags found
No related merge requests found
Pipeline #52874 passed
......@@ -248,7 +248,7 @@ trainer.service.password=<votre password>
[NOTE]
====
Vous devriez déjà avoir modifié votre code pour ne plus utiliser les `RestTemplate`.
Cette section est conservée à but documentaire, en principe vous devriez pouvoir passer à la partie suivante directement.
Cette section est conservée à but documentaire, en principe, vous devriez pouvoir passer à la partie suivante directement : <<_http_interfaces>>.
====
Nous devons également modifier notre usage du `RestTemplate` pour utiliser l'authentification.
......@@ -352,7 +352,7 @@ Pour utiliser une authentification basique sur une _HTTP Interface_ Spring, il f
Un exemple est présent dans la https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#_creating_a_restclient[documentation de Spring].
Dans la classe qui configure vos _HTTP Interfaces_, recevez en injection de dépendance le `user` et `password` de l'API Trainers, avec `@Value`, et utilisez ces valeurs pour générer un header.
Dans la classe qui configure vos _HTTP Interfaces_, recevez en injection de dépendance le `user` et `password` de l'API Trainers, avec `@Value`, et utilisez ces valeurs pour générer un header Http avec la méthode `HttpHeaders.encodeBasicAuth()`. Injectez votre header dans le RestClient avec la méthode `requestInitializer` du `RestClient.Builder`.
== Sécuriser `game-ui` avec un accès OpenID Connect
......@@ -438,9 +438,9 @@ spring.security.oauth2.client.provider.gitlab.issuer-uri=https://gitlab.univ-lil
Les properties possibles sont détaillées dans https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html[la doc de Spring Security]
Pour activer l'utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un `SecurityFilterChain` utilisant l'authentification OIDC.
Pour activer l'utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un `SecurityFilterChain` utilisant l'authentification OIDC, avec la méthode `oauth2Login()`.
Reportez vous à https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean[cet exemple] de la documentation de Spring Security :
Reportez-vous à https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean[cet exemple] de la documentation de Spring Security :
[source,java]
.OAuth2LoginSecurityConfig.java
......@@ -475,7 +475,6 @@ Il est possible de détecter la connexion en customisant l'appel à `oauth2Login
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(Customizer.withDefaults())
.authorizeHttpRequests(authorize -> {
authorize.anyRequest().authenticated();
})
......@@ -493,9 +492,9 @@ Implémentez l'appel à l'API Trainer, qui vérifie si un Trainer existe déjà
Nous souhaitons créer une page "Mon profil" pour nos dresseurs de Pokemon.
Sur cette page, ils pourraient lister leurs pokemons.
Sur cette page, ils pourraient lister leurs Pokemons.
Cette page pourrait être disponible à l'url http://localhost:9000/profile[,window="_blank"] et ressembler à ça :
Cette page pourrait être disponible à l'URL http://localhost:9000/profile[,window="_blank"] et ressembler à ça :
.La page profil de Sacha
image::images/ash_profile.png[]
......@@ -651,7 +650,7 @@ Vous pouvez créer une barre de navigation pour votre application, qui affiche l
== Pour aller plus loin
* implémentez un flow d'inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ)
* implémentez un flow d'inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ) :
** dans le `successHandler` du customizer du `.oauth2Login`, il est possible de faire des `response.sendRedirect` pour rediriger l'utilisateur sur une page précise après son login
* une fois un joueur connecté, il peut choisir l'un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ.
* une fois un joueur connecté, il peut choisir l'un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ, s'il ne possède pas encore de Pokémon dans son équipe
* la dernière étape de son inscription consiste à faire un `POST` sur l'API Trainers, pour modifier le Trainer du joueur en base de données.
......@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.18">
<meta name="generator" content="Asciidoctor 2.0.23">
<title>ALOM - TP 7 - Security</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
......@@ -140,7 +140,7 @@ p a>code:hover{color:rgba(0,0,0,.9)}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
......@@ -162,6 +162,7 @@ p a>code:hover{color:rgba(0,0,0,.9)}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
......@@ -208,13 +209,10 @@ table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
......@@ -330,7 +328,7 @@ a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
......@@ -393,7 +391,7 @@ b.conum *{color:inherit!important}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
......@@ -437,75 +435,122 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
pre.pygments .hll { background-color: #ffffcc }
pre.pygments { background: #f8f8f8; }
pre.pygments .tok-c { color: #408080; font-style: italic } /* Comment */
pre.pygments .tok-err { border: 1px solid #FF0000 } /* Error */
pre.pygments .tok-k { color: #008000; font-weight: bold } /* Keyword */
pre.pygments .tok-o { color: #666666 } /* Operator */
pre.pygments .tok-ch { color: #408080; font-style: italic } /* Comment.Hashbang */
pre.pygments .tok-cm { color: #408080; font-style: italic } /* Comment.Multiline */
pre.pygments .tok-cp { color: #BC7A00 } /* Comment.Preproc */
pre.pygments .tok-cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
pre.pygments .tok-c1 { color: #408080; font-style: italic } /* Comment.Single */
pre.pygments .tok-cs { color: #408080; font-style: italic } /* Comment.Special */
pre.pygments .tok-gd { color: #A00000 } /* Generic.Deleted */
pre.pygments .tok-ge { font-style: italic } /* Generic.Emph */
pre.pygments .tok-gr { color: #FF0000 } /* Generic.Error */
pre.pygments .tok-gh { color: #000080; font-weight: bold } /* Generic.Heading */
pre.pygments .tok-gi { color: #00A000 } /* Generic.Inserted */
pre.pygments .tok-go { color: #888888 } /* Generic.Output */
pre.pygments .tok-gp { color: #000080; font-weight: bold } /* Generic.Prompt */
pre.pygments .tok-gs { font-weight: bold } /* Generic.Strong */
pre.pygments .tok-gu { color: #800080; font-weight: bold } /* Generic.Subheading */
pre.pygments .tok-gt { color: #0044DD } /* Generic.Traceback */
pre.pygments .tok-kc { color: #008000; font-weight: bold } /* Keyword.Constant */
pre.pygments .tok-kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
pre.pygments .tok-kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
pre.pygments .tok-kp { color: #008000 } /* Keyword.Pseudo */
pre.pygments .tok-kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
pre.pygments .tok-kt { color: #B00040 } /* Keyword.Type */
pre.pygments .tok-m { color: #666666 } /* Literal.Number */
pre.pygments .tok-s { color: #BA2121 } /* Literal.String */
pre.pygments .tok-na { color: #7D9029 } /* Name.Attribute */
pre.pygments .tok-nb { color: #008000 } /* Name.Builtin */
pre.pygments .tok-nc { color: #0000FF; font-weight: bold } /* Name.Class */
pre.pygments .tok-no { color: #880000 } /* Name.Constant */
pre.pygments .tok-nd { color: #AA22FF } /* Name.Decorator */
pre.pygments .tok-ni { color: #999999; font-weight: bold } /* Name.Entity */
pre.pygments .tok-ne { color: #D2413A; font-weight: bold } /* Name.Exception */
pre.pygments .tok-nf { color: #0000FF } /* Name.Function */
pre.pygments .tok-nl { color: #A0A000 } /* Name.Label */
pre.pygments .tok-nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
pre.pygments .tok-nt { color: #008000; font-weight: bold } /* Name.Tag */
pre.pygments .tok-nv { color: #19177C } /* Name.Variable */
pre.pygments .tok-ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
pre.pygments .tok-w { color: #bbbbbb } /* Text.Whitespace */
pre.pygments .tok-mb { color: #666666 } /* Literal.Number.Bin */
pre.pygments .tok-mf { color: #666666 } /* Literal.Number.Float */
pre.pygments .tok-mh { color: #666666 } /* Literal.Number.Hex */
pre.pygments .tok-mi { color: #666666 } /* Literal.Number.Integer */
pre.pygments .tok-mo { color: #666666 } /* Literal.Number.Oct */
pre.pygments .tok-sa { color: #BA2121 } /* Literal.String.Affix */
pre.pygments .tok-sb { color: #BA2121 } /* Literal.String.Backtick */
pre.pygments .tok-sc { color: #BA2121 } /* Literal.String.Char */
pre.pygments .tok-dl { color: #BA2121 } /* Literal.String.Delimiter */
pre.pygments .tok-sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
pre.pygments .tok-s2 { color: #BA2121 } /* Literal.String.Double */
pre.pygments .tok-se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
pre.pygments .tok-sh { color: #BA2121 } /* Literal.String.Heredoc */
pre.pygments .tok-si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
pre.pygments .tok-sx { color: #008000 } /* Literal.String.Other */
pre.pygments .tok-sr { color: #BB6688 } /* Literal.String.Regex */
pre.pygments .tok-s1 { color: #BA2121 } /* Literal.String.Single */
pre.pygments .tok-ss { color: #19177C } /* Literal.String.Symbol */
pre.pygments .tok-bp { color: #008000 } /* Name.Builtin.Pseudo */
pre.pygments .tok-fm { color: #0000FF } /* Name.Function.Magic */
pre.pygments .tok-vc { color: #19177C } /* Name.Variable.Class */
pre.pygments .tok-vg { color: #19177C } /* Name.Variable.Global */
pre.pygments .tok-vi { color: #19177C } /* Name.Variable.Instance */
pre.pygments .tok-vm { color: #19177C } /* Name.Variable.Magic */
pre.pygments .tok-il { color: #666666 } /* Literal.Number.Integer.Long */
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge, pre.rouge .w {
color: #24292f;
background-color: #f6f8fa;
}
pre.rouge .k, pre.rouge .kd, pre.rouge .kn, pre.rouge .kp, pre.rouge .kr, pre.rouge .kt, pre.rouge .kv {
color: #cf222e;
}
pre.rouge .gr {
color: #f6f8fa;
}
pre.rouge .gd {
color: #82071e;
background-color: #ffebe9;
}
pre.rouge .nb {
color: #953800;
}
pre.rouge .nc {
color: #953800;
}
pre.rouge .no {
color: #953800;
}
pre.rouge .nn {
color: #953800;
}
pre.rouge .sr {
color: #116329;
}
pre.rouge .na {
color: #116329;
}
pre.rouge .nt {
color: #116329;
}
pre.rouge .gi {
color: #116329;
background-color: #dafbe1;
}
pre.rouge .ges {
font-weight: bold;
font-style: italic;
}
pre.rouge .kc {
color: #0550ae;
}
pre.rouge .l, pre.rouge .ld, pre.rouge .m, pre.rouge .mb, pre.rouge .mf, pre.rouge .mh, pre.rouge .mi, pre.rouge .il, pre.rouge .mo, pre.rouge .mx {
color: #0550ae;
}
pre.rouge .sb {
color: #0550ae;
}
pre.rouge .bp {
color: #0550ae;
}
pre.rouge .ne {
color: #0550ae;
}
pre.rouge .nl {
color: #0550ae;
}
pre.rouge .py {
color: #0550ae;
}
pre.rouge .nv, pre.rouge .vc, pre.rouge .vg, pre.rouge .vi, pre.rouge .vm {
color: #0550ae;
}
pre.rouge .o, pre.rouge .ow {
color: #0550ae;
}
pre.rouge .gh {
color: #0550ae;
font-weight: bold;
}
pre.rouge .gu {
color: #0550ae;
font-weight: bold;
}
pre.rouge .s, pre.rouge .sa, pre.rouge .sc, pre.rouge .dl, pre.rouge .sd, pre.rouge .s2, pre.rouge .se, pre.rouge .sh, pre.rouge .sx, pre.rouge .s1, pre.rouge .ss {
color: #0a3069;
}
pre.rouge .nd {
color: #8250df;
}
pre.rouge .nf, pre.rouge .fm {
color: #8250df;
}
pre.rouge .err {
color: #f6f8fa;
background-color: #82071e;
}
pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cm, pre.rouge .cp, pre.rouge .cpf, pre.rouge .c1, pre.rouge .cs {
color: #6e7781;
}
pre.rouge .gl {
color: #6e7781;
}
pre.rouge .gt {
color: #6e7781;
}
pre.rouge .ni {
color: #24292f;
}
pre.rouge .si {
color: #24292f;
}
pre.rouge .ge {
color: #24292f;
font-style: italic;
}
pre.rouge .gs {
color: #24292f;
font-weight: bold;
}
</style>
</head>
<body class="article toc2 toc-left">
......@@ -642,10 +687,10 @@ Nous ne sécuriserons pas l&#8217;accès à l&#8217;API <code>pokemon-type</code
<div class="listingblock">
<div class="title">pom.xml</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="xml"><span></span><span class="tok-nt">&lt;dependency&gt;</span>
<span class="tok-nt">&lt;groupId&gt;</span>org.springframework.boot<span class="tok-nt">&lt;/groupId&gt;</span>
<span class="tok-nt">&lt;artifactId&gt;</span>spring-boot-starter-security<span class="tok-nt">&lt;/artifactId&gt;</span>
<span class="tok-nt">&lt;/dependency&gt;</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="xml"><span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.springframework.boot<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>spring-boot-starter-security<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;/dependency&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
......@@ -656,12 +701,12 @@ Nous ne sécuriserons pas l&#8217;accès à l&#8217;API <code>pokemon-type</code
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="bash"><span></span>INFO --- <span class="tok-o">[</span>main<span class="tok-o">]</span> .s.s.UserDetailsServiceAutoConfiguration :
<pre class="rouge highlight nowrap"><code data-lang="bash">INFO <span class="nt">---</span> <span class="o">[</span>main] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 336470fd-a4be-474e-9e1a-84359f8b3808 <i class="conum" data-value="1"></i><b>(1)</b>
<i class="conum" data-value="2"></i><b>(2)</b>
INFO --- <span class="tok-o">[</span>main<span class="tok-o">]</span> o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, <span class="tok-o">[</span>org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@45cf0c15, org.springframework.security.web.context.SecurityContextPersistenceFilter@becb93a, org.springframework.security.web.header.HeaderWriterFilter@723b8eff, org.springframework.security.web.csrf.CsrfFilter@1fec9d33, org.springframework.security.web.authentication.logout.LogoutFilter@7852ab30, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@508b4f70, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@5e9f1a4c, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@2f2dc407, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@67ceaa9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1d1fd2aa, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@65a2e14e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@c96c497, org.springframework.security.web.session.SessionManagementFilter@20d65767, org.springframework.security.web.access.ExceptionTranslationFilter@39840986, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@42fa5cb<span class="tok-o">]</span></code></pre>
INFO <span class="nt">---</span> <span class="o">[</span>main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, <span class="o">[</span>org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@45cf0c15, org.springframework.security.web.context.SecurityContextPersistenceFilter@becb93a, org.springframework.security.web.header.HeaderWriterFilter@723b8eff, org.springframework.security.web.csrf.CsrfFilter@1fec9d33, org.springframework.security.web.authentication.logout.LogoutFilter@7852ab30, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@508b4f70, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@5e9f1a4c, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@2f2dc407, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@67ceaa9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1d1fd2aa, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@65a2e14e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@c96c497, org.springframework.security.web.session.SessionManagementFilter@20d65767, org.springframework.security.web.access.ExceptionTranslationFilter@39840986, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@42fa5cb]</code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -708,7 +753,7 @@ INFO --- <span class="tok-o">[</span>main<span class="tok-o">]</span> o.s.s.web.
<div class="listingblock">
<div class="title">application.properties</div>
<div class="content">
<pre class="pygments highlight nowrap"><code><span></span>spring.security.user.name=user
<pre class="rouge highlight nowrap"><code>spring.security.user.name=user
spring.security.user.password=&lt;votre-uuid&gt;</code></pre>
</div>
</div>
......@@ -720,13 +765,13 @@ spring.security.user.password=&lt;votre-uuid&gt;</code></pre>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="javascript"><span></span><span class="tok-p">{</span>
<span class="tok-s2">&quot;timestamp&quot;</span><span class="tok-o">:</span> <span class="tok-s2">&quot;2019-03-08T09:39:51.720+0000&quot;</span><span class="tok-p">,</span>
<span class="tok-s2">&quot;status&quot;</span><span class="tok-o">:</span> <span class="tok-mf">401</span><span class="tok-p">,</span>
<span class="tok-s2">&quot;error&quot;</span><span class="tok-o">:</span> <span class="tok-s2">&quot;Unauthorized&quot;</span><span class="tok-p">,</span>
<span class="tok-s2">&quot;message&quot;</span><span class="tok-o">:</span> <span class="tok-s2">&quot;Unauthorized&quot;</span><span class="tok-p">,</span>
<span class="tok-s2">&quot;path&quot;</span><span class="tok-o">:</span> <span class="tok-s2">&quot;/trainers&quot;</span>
<span class="tok-p">}</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="javascript"><span class="p">{</span>
<span class="dl">"</span><span class="s2">timestamp</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">2019-03-08T09:39:51.720+0000</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">status</span><span class="dl">"</span><span class="p">:</span> <span class="mi">401</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">error</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Unauthorized</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">message</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Unauthorized</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">path</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">/trainers</span><span class="dl">"</span>
<span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
......@@ -767,8 +812,8 @@ sur l&#8217;url de votre api avec un browser classique <a href="http://localhost
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="bash"><span></span>DEBUG XXX --- <span class="tok-o">[</span>main<span class="tok-o">]</span> o.s.web.client.RestTemplate : Response <span class="tok-m">401</span> UNAUTHORIZED
DEBUG XXX --- <span class="tok-o">[</span>main<span class="tok-o">]</span> o.s.web.client.RestTemplate : Reading to <span class="tok-o">[</span>com.miage.alom.tp.trainer_api.bo.Trainer<span class="tok-o">]</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="bash">DEBUG XXX <span class="nt">---</span> <span class="o">[</span>main] o.s.web.client.RestTemplate : Response 401 UNAUTHORIZED
DEBUG XXX <span class="nt">---</span> <span class="o">[</span>main] o.s.web.client.RestTemplate : Reading to <span class="o">[</span>com.miage.alom.tp.trainer_api.bo.Trainer]</code></pre>
</div>
</div>
<div class="paragraph">
......@@ -793,88 +838,89 @@ DEBUG XXX --- <span class="tok-o">[</span>main<span class="tok-o">]</span> o.s.w
<div class="listingblock">
<div class="title">TrainerControllerIntegrationTest.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span></pre></div></td><td class="code"><pre><span></span><span class="tok-nd">@SpringBootTest</span><span class="tok-p">(</span><span class="tok-n">webEnvironment</span> <span class="tok-o">=</span> <span class="tok-n">SpringBootTest</span><span class="tok-p">.</span><span class="tok-na">WebEnvironment</span><span class="tok-p">.</span><span class="tok-na">RANDOM_PORT</span><span class="tok-p">)</span>
<span class="tok-kd">class</span> <span class="tok-nc">TrainerControllerIntegrationTest</span> <span class="tok-p">{</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre><span class="nd">@SpringBootTest</span><span class="o">(</span><span class="n">webEnvironment</span> <span class="o">=</span> <span class="nc">SpringBootTest</span><span class="o">.</span><span class="na">WebEnvironment</span><span class="o">.</span><span class="na">RANDOM_PORT</span><span class="o">)</span>
<span class="kd">class</span> <span class="nc">TrainerControllerIntegrationTest</span> <span class="o">{</span>
<span class="tok-nd">@LocalServerPort</span>
<span class="tok-kd">private</span> <span class="tok-kt">int</span> <span class="tok-n">port</span><span class="tok-p">;</span>
<span class="nd">@LocalServerPort</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">port</span><span class="o">;</span>
<span class="tok-nd">@Autowired</span>
<span class="tok-kd">private</span> <span class="tok-n">TestRestTemplate</span> <span class="tok-n">restTemplate</span><span class="tok-p">;</span>
<span class="nd">@Autowired</span>
<span class="kd">private</span> <span class="nc">TestRestTemplate</span> <span class="n">restTemplate</span><span class="o">;</span>
<span class="tok-nd">@Autowired</span>
<span class="tok-kd">private</span> <span class="tok-n">TrainerController</span> <span class="tok-n">controller</span><span class="tok-p">;</span>
<span class="nd">@Autowired</span>
<span class="kd">private</span> <span class="nc">TrainerController</span> <span class="n">controller</span><span class="o">;</span>
<span class="tok-nd">@Value</span><span class="tok-p">(</span><span class="tok-s">&quot;&quot;</span><span class="tok-p">)</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="tok-kd">private</span> <span class="tok-n">String</span> <span class="tok-n">username</span><span class="tok-p">;</span>
<span class="nd">@Value</span><span class="o">(</span><span class="s">""</span><span class="o">)</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">username</span><span class="o">;</span>
<i class="conum" data-value="2"></i><b>(2)</b>
<span class="tok-kd">private</span> <span class="tok-n">String</span> <span class="tok-n">password</span><span class="tok-p">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">password</span><span class="o">;</span>
<span class="tok-nd">@Test</span> <i class="conum" data-value="3"></i><b>(3)</b>
<span class="tok-kt">void</span> <span class="tok-nf">getTrainers_shouldThrowAnUnauthorized</span><span class="tok-p">(){</span>
<span class="tok-kd">var</span> <span class="tok-n">responseEntity</span> <span class="tok-o">=</span> <span class="tok-k">this</span><span class="tok-p">.</span><span class="tok-na">restTemplate</span>
<span class="tok-p">.</span><span class="tok-na">getForEntity</span><span class="tok-p">(</span><span class="tok-s">&quot;http://localhost:&quot;</span> <span class="tok-o">+</span> <span class="tok-n">port</span> <span class="tok-o">+</span> <span class="tok-s">&quot;/trainers/Ash&quot;</span><span class="tok-p">,</span> <span class="tok-n">Trainer</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">);</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">responseEntity</span><span class="tok-p">);</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-mi">401</span><span class="tok-p">,</span> <span class="tok-n">responseEntity</span><span class="tok-p">.</span><span class="tok-na">getStatusCodeValue</span><span class="tok-p">());</span>
<span class="tok-p">}</span>
<span class="nd">@Test</span> <i class="conum" data-value="3"></i><b>(3)</b>
<span class="kt">void</span> <span class="nf">getTrainers_shouldThrowAnUnauthorized</span><span class="o">(){</span>
<span class="kt">var</span> <span class="n">responseEntity</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">restTemplate</span>
<span class="o">.</span><span class="na">getForEntity</span><span class="o">(</span><span class="s">"http://localhost:"</span> <span class="o">+</span> <span class="n">port</span> <span class="o">+</span> <span class="s">"/trainers/Ash"</span><span class="o">,</span> <span class="nc">Trainer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">responseEntity</span><span class="o">);</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mi">401</span><span class="o">,</span> <span class="n">responseEntity</span><span class="o">.</span><span class="na">getStatusCodeValue</span><span class="o">());</span>
<span class="o">}</span>
<span class="tok-nd">@Test</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="tok-kt">void</span> <span class="tok-nf">getTrainer_withNameAsh_shouldReturnAsh</span><span class="tok-p">()</span> <span class="tok-p">{</span>
<span class="tok-kd">var</span> <span class="tok-n">ash</span> <span class="tok-o">=</span> <span class="tok-k">this</span><span class="tok-p">.</span><span class="tok-na">restTemplate</span>
<span class="tok-p">.</span><span class="tok-na">withBasicAuth</span><span class="tok-p">(</span><span class="tok-n">username</span><span class="tok-p">,</span> <span class="tok-n">password</span><span class="tok-p">)</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="tok-p">.</span><span class="tok-na">getForObject</span><span class="tok-p">(</span><span class="tok-s">&quot;http://localhost:&quot;</span> <span class="tok-o">+</span> <span class="tok-n">port</span> <span class="tok-o">+</span> <span class="tok-s">&quot;/trainers/Ash&quot;</span><span class="tok-p">,</span> <span class="tok-n">Trainer</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">);</span>
<span class="nd">@Test</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="kt">void</span> <span class="nf">getTrainer_withNameAsh_shouldReturnAsh</span><span class="o">()</span> <span class="o">{</span>
<span class="kt">var</span> <span class="n">ash</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">restTemplate</span>
<span class="o">.</span><span class="na">withBasicAuth</span><span class="o">(</span><span class="n">username</span><span class="o">,</span> <span class="n">password</span><span class="o">)</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="o">.</span><span class="na">getForObject</span><span class="o">(</span><span class="s">"http://localhost:"</span> <span class="o">+</span> <span class="n">port</span> <span class="o">+</span> <span class="s">"/trainers/Ash"</span><span class="o">,</span> <span class="nc">Trainer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">ash</span><span class="tok-p">);</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-s">&quot;Ash&quot;</span><span class="tok-p">,</span> <span class="tok-n">ash</span><span class="tok-p">.</span><span class="tok-na">getName</span><span class="tok-p">());</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-mi">1</span><span class="tok-p">,</span> <span class="tok-n">ash</span><span class="tok-p">.</span><span class="tok-na">getTeam</span><span class="tok-p">().</span><span class="tok-na">size</span><span class="tok-p">());</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">ash</span><span class="o">);</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="s">"Ash"</span><span class="o">,</span> <span class="n">ash</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">ash</span><span class="o">.</span><span class="na">getTeam</span><span class="o">().</span><span class="na">size</span><span class="o">());</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-mi">25</span><span class="tok-p">,</span> <span class="tok-n">ash</span><span class="tok-p">.</span><span class="tok-na">getTeam</span><span class="tok-p">().</span><span class="tok-na">get</span><span class="tok-p">(</span><span class="tok-mi">0</span><span class="tok-p">).</span><span class="tok-na">getPokemonType</span><span class="tok-p">());</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-mi">18</span><span class="tok-p">,</span> <span class="tok-n">ash</span><span class="tok-p">.</span><span class="tok-na">getTeam</span><span class="tok-p">().</span><span class="tok-na">get</span><span class="tok-p">(</span><span class="tok-mi">0</span><span class="tok-p">).</span><span class="tok-na">getLevel</span><span class="tok-p">());</span>
<span class="tok-p">}</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mi">25</span><span class="o">,</span> <span class="n">ash</span><span class="o">.</span><span class="na">getTeam</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getPokemonType</span><span class="o">());</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mi">18</span><span class="o">,</span> <span class="n">ash</span><span class="o">.</span><span class="na">getTeam</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getLevel</span><span class="o">());</span>
<span class="o">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -912,34 +958,35 @@ Cette mécanique permet de s&#8217;assurer qu&#8217;une requête qui modifie des
<div class="listingblock">
<div class="title">SecurityConfig.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span></pre></div></td><td class="code"><pre><span></span><span class="tok-nd">@Configuration</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="tok-kd">public</span> <span class="tok-kd">class</span> <span class="tok-nc">SecurityConfig</span> <span class="tok-p">{</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre><span class="nd">@Configuration</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SecurityConfig</span> <span class="o">{</span>
<span class="tok-nd">@Bean</span>
<span class="tok-n">SecurityFilterChain</span> <span class="tok-nf">securityFilterChain</span><span class="tok-p">(</span><span class="tok-n">HttpSecurity</span> <span class="tok-n">http</span><span class="tok-p">)</span> <span class="tok-kd">throws</span> <span class="tok-n">Exception</span> <span class="tok-p">{</span>
<span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">csrf</span><span class="tok-p">(</span><span class="tok-n">csrf</span> <span class="tok-o">-&gt;</span> <span class="tok-n">csrf</span><span class="tok-p">.</span><span class="tok-na">disable</span><span class="tok-p">());</span> <i class="conum" data-value="2"></i><b>(2)</b>
<span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">authorizeHttpRequests</span><span class="tok-p">(</span><span class="tok-n">authorize</span> <span class="tok-o">-&gt;</span> <span class="tok-p">{</span>
<span class="tok-n">authorize</span><span class="tok-p">.</span><span class="tok-na">anyRequest</span><span class="tok-p">().</span><span class="tok-na">authenticated</span><span class="tok-p">();</span> <i class="conum" data-value="3"></i><b>(3)</b>
<span class="tok-p">}</span>
<span class="tok-p">);</span>
<span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">httpBasic</span><span class="tok-p">(</span><span class="tok-n">Customizer</span><span class="tok-p">.</span><span class="tok-na">withDefaults</span><span class="tok-p">());</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="tok-k">return</span> <span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">build</span><span class="tok-p">();</span>
<span class="tok-p">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="nd">@Bean</span>
<span class="nc">SecurityFilterChain</span> <span class="nf">securityFilterChain</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="n">http</span><span class="o">.</span><span class="na">csrf</span><span class="o">(</span><span class="n">csrf</span> <span class="o">-&gt;</span> <span class="n">csrf</span><span class="o">.</span><span class="na">disable</span><span class="o">());</span> <i class="conum" data-value="2"></i><b>(2)</b>
<span class="n">http</span><span class="o">.</span><span class="na">authorizeHttpRequests</span><span class="o">(</span><span class="n">authorize</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="n">authorize</span><span class="o">.</span><span class="na">anyRequest</span><span class="o">().</span><span class="na">authenticated</span><span class="o">();</span> <i class="conum" data-value="3"></i><b>(3)</b>
<span class="o">}</span>
<span class="o">);</span>
<span class="n">http</span><span class="o">.</span><span class="na">httpBasic</span><span class="o">(</span><span class="nc">Customizer</span><span class="o">.</span><span class="na">withDefaults</span><span class="o">());</span> <i class="conum" data-value="4"></i><b>(4)</b>
<span class="k">return</span> <span class="n">http</span><span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -986,9 +1033,9 @@ En particulier sur le <code>game-ui</code>.</p>
<div class="listingblock">
<div class="title">application.properties</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="properties"><span></span><span class="tok-na">trainer.service.url</span><span class="tok-o">=</span><span class="tok-s">http://localhost:8081</span>
<span class="tok-na">trainer.service.username</span><span class="tok-o">=</span><span class="tok-s">user</span>
<span class="tok-na">trainer.service.password</span><span class="tok-o">=</span><span class="tok-s">&lt;votre password&gt;</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="properties"><span class="py">trainer.service.url</span><span class="p">=</span><span class="s">http://localhost:8081</span>
<span class="py">trainer.service.username</span><span class="p">=</span><span class="s">user</span>
<span class="py">trainer.service.password</span><span class="p">=</span><span class="s">&lt;votre password&gt;</span></code></pre>
</div>
</div>
</div>
......@@ -1005,7 +1052,7 @@ En particulier sur le <code>game-ui</code>.</p>
<td class="content">
<div class="paragraph">
<p>Vous devriez déjà avoir modifié votre code pour ne plus utiliser les <code>RestTemplate</code>.
Cette section est conservée à but documentaire, en principe vous devriez pouvoir passer à la partie suivante directement.</p>
Cette section est conservée à but documentaire, en principe, vous devriez pouvoir passer à la partie suivante directement : <a href="#_http_interfaces">HTTP Interfaces</a>.</p>
</div>
</td>
</tr>
......@@ -1038,70 +1085,71 @@ Hé ! On pourrait faire pareil pour transmettre la <code>Locale</code> de notre
<div class="listingblock">
<div class="title">com.miage.alom.tp.game_ui.config.RestConfigurationTest.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span></pre></div></td><td class="code"><pre><span></span><span class="tok-kn">package</span> <span class="tok-nn">com.miage.alom.tp.game_ui.config</span><span class="tok-p">;</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre><span class="kn">package</span> <span class="nn">com.miage.alom.tp.game_ui.config</span><span class="o">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.junit.jupiter.api.Test</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.http.client.support.BasicAuthenticationInterceptor</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">org.junit.jupiter.api.Test</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.http.client.support.BasicAuthenticationInterceptor</span><span class="o">;</span>
<span class="tok-kn">import static</span> <span class="tok-nn">org.junit.jupiter.api.Assertions.*</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">junit</span><span class="o">.</span><span class="na">jupiter</span><span class="o">.</span><span class="na">api</span><span class="o">.</span><span class="na">Assertions</span><span class="o">.*;</span>
<span class="tok-kd">class</span> <span class="tok-nc">RestConfigurationTest</span> <span class="tok-p">{</span>
<span class="kd">class</span> <span class="nc">RestConfigurationTest</span> <span class="o">{</span>
<span class="tok-nd">@Test</span>
<span class="tok-kt">void</span> <span class="tok-nf">restTemplate_shouldExist</span><span class="tok-p">()</span> <span class="tok-p">{</span>
<span class="tok-kd">var</span> <span class="tok-n">restTemplate</span> <span class="tok-o">=</span> <span class="tok-k">new</span> <span class="tok-n">RestConfiguration</span><span class="tok-p">().</span><span class="tok-na">restTemplate</span><span class="tok-p">();</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">restTemplate_shouldExist</span><span class="o">()</span> <span class="o">{</span>
<span class="kt">var</span> <span class="n">restTemplate</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">RestConfiguration</span><span class="o">().</span><span class="na">restTemplate</span><span class="o">();</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">restTemplate</span><span class="tok-p">);</span>
<span class="tok-p">}</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">restTemplate</span><span class="o">);</span>
<span class="o">}</span>
<span class="tok-nd">@Test</span>
<span class="tok-kt">void</span> <span class="tok-nf">trainerApiRestTemplate_shouldHaveBasicAuth</span><span class="tok-p">()</span> <span class="tok-p">{</span>
<span class="tok-kd">var</span> <span class="tok-n">restTemplate</span> <span class="tok-o">=</span> <span class="tok-k">new</span> <span class="tok-n">RestConfiguration</span><span class="tok-p">().</span><span class="tok-na">trainerApiRestTemplate</span><span class="tok-p">();</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">trainerApiRestTemplate_shouldHaveBasicAuth</span><span class="o">()</span> <span class="o">{</span>
<span class="kt">var</span> <span class="n">restTemplate</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">RestConfiguration</span><span class="o">().</span><span class="na">trainerApiRestTemplate</span><span class="o">();</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">restTemplate</span><span class="tok-p">);</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">restTemplate</span><span class="o">);</span>
<span class="tok-kd">var</span> <span class="tok-n">interceptors</span> <span class="tok-o">=</span> <span class="tok-n">restTemplate</span><span class="tok-p">.</span><span class="tok-na">getInterceptors</span><span class="tok-p">();</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">interceptors</span><span class="tok-p">);</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-mi">1</span><span class="tok-p">,</span> <span class="tok-n">interceptors</span><span class="tok-p">.</span><span class="tok-na">size</span><span class="tok-p">());</span>
<span class="kt">var</span> <span class="n">interceptors</span> <span class="o">=</span> <span class="n">restTemplate</span><span class="o">.</span><span class="na">getInterceptors</span><span class="o">();</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">interceptors</span><span class="o">);</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">interceptors</span><span class="o">.</span><span class="na">size</span><span class="o">());</span>
<span class="tok-kd">var</span> <span class="tok-n">interceptor</span> <span class="tok-o">=</span> <span class="tok-n">interceptors</span><span class="tok-p">.</span><span class="tok-na">get</span><span class="tok-p">(</span><span class="tok-mi">0</span><span class="tok-p">);</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">interceptor</span><span class="tok-p">);</span>
<span class="kt">var</span> <span class="n">interceptor</span> <span class="o">=</span> <span class="n">interceptors</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">interceptor</span><span class="o">);</span>
<span class="tok-n">assertEquals</span><span class="tok-p">(</span><span class="tok-n">BasicAuthenticationInterceptor</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">,</span> <span class="tok-n">interceptor</span><span class="tok-p">.</span><span class="tok-na">getClass</span><span class="tok-p">());</span>
<span class="tok-p">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="n">assertEquals</span><span class="o">(</span><span class="nc">BasicAuthenticationInterceptor</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">interceptor</span><span class="o">.</span><span class="na">getClass</span><span class="o">());</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
</div>
......@@ -1113,36 +1161,37 @@ Hé ! On pourrait faire pareil pour transmettre la <code>Locale</code> de notre
<div class="listingblock">
<div class="title">RestConfiguration.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span></pre></div></td><td class="code"><pre><span></span><span class="tok-nd">@Configuration</span>
<span class="tok-kd">public</span> <span class="tok-kd">class</span> <span class="tok-nc">RestConfiguration</span> <span class="tok-p">{</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre><span class="nd">@Configuration</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">RestConfiguration</span> <span class="o">{</span>
<i class="conum" data-value="1"></i><b>(1)</b>
<span class="tok-nd">@Bean</span>
<span class="tok-n">RestTemplate</span> <span class="tok-nf">trainerApiRestTemplate</span><span class="tok-p">(){</span> <i class="conum" data-value="2"></i><b>(2)</b>
<span class="tok-c1">// TODO</span>
<span class="tok-p">}</span>
<span class="nd">@Bean</span>
<span class="nc">RestTemplate</span> <span class="nf">trainerApiRestTemplate</span><span class="o">(){</span> <i class="conum" data-value="2"></i><b>(2)</b>
<span class="c1">// TODO</span>
<span class="o">}</span>
<span class="tok-nd">@Bean</span>
<span class="tok-n">RestTemplate</span> <span class="tok-nf">restTemplate</span><span class="tok-p">(){</span>
<span class="tok-k">return</span> <span class="tok-k">new</span> <span class="tok-n">RestTemplate</span><span class="tok-p">();</span>
<span class="tok-p">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="nd">@Bean</span>
<span class="nc">RestTemplate</span> <span class="nf">restTemplate</span><span class="o">(){</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">RestTemplate</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -1173,16 +1222,17 @@ Il faut indiquer à spring quel <code>RestTemplate</code> sélectionner lorsqu&#
<div class="listingblock">
<div class="title">TrainerServiceImpl.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span></pre></div></td><td class="code"><pre><span></span><span class="tok-nd">@Autowired</span>
<span class="tok-nd">@Qualifier</span><span class="tok-p">(</span><span class="tok-s">&quot;trainerApiRestTemplate&quot;</span><span class="tok-p">)</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="tok-kt">void</span> <span class="tok-nf">setRestTemplate</span><span class="tok-p">(</span><span class="tok-n">RestTemplate</span> <span class="tok-n">restTemplate</span><span class="tok-p">)</span> <span class="tok-p">{</span>
<span class="tok-k">this</span><span class="tok-p">.</span><span class="tok-na">restTemplate</span> <span class="tok-o">=</span> <span class="tok-n">restTemplate</span><span class="tok-p">;</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="code"><pre><span class="nd">@Autowired</span>
<span class="nd">@Qualifier</span><span class="o">(</span><span class="s">"trainerApiRestTemplate"</span><span class="o">)</span> <i class="conum" data-value="1"></i><b>(1)</b>
<span class="kt">void</span> <span class="nf">setRestTemplate</span><span class="o">(</span><span class="nc">RestTemplate</span> <span class="n">restTemplate</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">restTemplate</span> <span class="o">=</span> <span class="n">restTemplate</span><span class="o">;</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -1204,7 +1254,7 @@ Il faut indiquer à spring quel <code>RestTemplate</code> sélectionner lorsqu&#
<p>Un exemple est présent dans la <a href="https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#_creating_a_restclient">documentation de Spring</a>.</p>
</div>
<div class="paragraph">
<p>Dans la classe qui configure vos <em>HTTP Interfaces</em>, recevez en injection de dépendance le <code>user</code> et <code>password</code> de l&#8217;API Trainers, avec <code>@Value</code>, et utilisez ces valeurs pour générer un header.</p>
<p>Dans la classe qui configure vos <em>HTTP Interfaces</em>, recevez en injection de dépendance le <code>user</code> et <code>password</code> de l&#8217;API Trainers, avec <code>@Value</code>, et utilisez ces valeurs pour générer un header Http avec la méthode <code>HttpHeaders.encodeBasicAuth()</code>. Injectez votre header dans le RestClient avec la méthode <code>requestInitializer</code> du <code>RestClient.Builder</code>.</p>
</div>
</div>
</div>
......@@ -1272,15 +1322,15 @@ Prenez note de l'<em>Application ID</em> et du <em>Secret</em> qui vous sont don
<div class="listingblock">
<div class="title">pom.xml</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="xml"><span></span><span class="tok-nt">&lt;dependency&gt;</span>
<span class="tok-nt">&lt;groupId&gt;</span>org.springframework.boot<span class="tok-nt">&lt;/groupId&gt;</span>
<span class="tok-nt">&lt;artifactId&gt;</span>spring-boot-starter-security<span class="tok-nt">&lt;/artifactId&gt;</span>
<span class="tok-nt">&lt;/dependency&gt;</span>
<pre class="rouge highlight nowrap"><code data-lang="xml"><span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.springframework.boot<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>spring-boot-starter-security<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
<span class="tok-nt">&lt;dependency&gt;</span>
<span class="tok-nt">&lt;groupId&gt;</span>org.springframework.boot<span class="tok-nt">&lt;/groupId&gt;</span>
<span class="tok-nt">&lt;artifactId&gt;</span>spring-boot-starter-oauth2-client<span class="tok-nt">&lt;/artifactId&gt;</span>
<span class="tok-nt">&lt;/dependency&gt;</span></code></pre>
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.springframework.boot<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>spring-boot-starter-oauth2-client<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;/dependency&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
......@@ -1315,10 +1365,10 @@ Pour rappel, le user par défaut de spring-security est <code>user</code> et le
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><span></span><span class="tok-nd">@GetMapping</span><span class="tok-p">(</span><span class="tok-s">&quot;/api/whoami&quot;</span><span class="tok-p">)</span>
<span class="tok-n">Object</span> <span class="tok-nf">whoami</span><span class="tok-p">(</span><span class="tok-n">Authentication</span> <span class="tok-n">authentication</span><span class="tok-p">){</span>
<span class="tok-k">return</span> <span class="tok-n">authentication</span><span class="tok-p">.</span><span class="tok-na">getPrincipal</span><span class="tok-p">();</span>
<span class="tok-p">}</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="java"><span class="nd">@GetMapping</span><span class="o">(</span><span class="s">"/api/whoami"</span><span class="o">)</span>
<span class="nc">Object</span> <span class="nf">whoami</span><span class="o">(</span><span class="nc">Authentication</span> <span class="n">authentication</span><span class="o">){</span>
<span class="k">return</span> <span class="n">authentication</span><span class="o">.</span><span class="na">getPrincipal</span><span class="o">();</span>
<span class="o">}</span></code></pre>
</div>
</div>
<div class="paragraph">
......@@ -1342,39 +1392,39 @@ Pour rappel, le user par défaut de spring-security est <code>user</code> et le
<div class="listingblock">
<div class="title">application.properties</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="properties"><span></span><span class="tok-na">spring.security.oauth2.client.registration.gitlab.client-id</span><span class="tok-o">=</span>
<span class="tok-na">spring.security.oauth2.client.registration.gitlab.client-secret</span><span class="tok-o">=</span>
<span class="tok-na">spring.security.oauth2.client.registration.gitlab.scope</span><span class="tok-o">=</span><span class="tok-s">openid</span>
<pre class="rouge highlight nowrap"><code data-lang="properties"><span class="py">spring.security.oauth2.client.registration.gitlab.client-id</span><span class="p">=</span>
<span class="py">spring.security.oauth2.client.registration.gitlab.client-secret</span><span class="p">=</span>
<span class="py">spring.security.oauth2.client.registration.gitlab.scope</span><span class="p">=</span><span class="s">openid</span>
<span class="tok-na">spring.security.oauth2.client.provider.gitlab.issuer-uri</span><span class="tok-o">=</span><span class="tok-s">https://gitlab.univ-lille.fr</span></code></pre>
<span class="py">spring.security.oauth2.client.provider.gitlab.issuer-uri</span><span class="p">=</span><span class="s">https://gitlab.univ-lille.fr</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Les properties possibles sont détaillées dans <a href="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html">la doc de Spring Security</a></p>
</div>
<div class="paragraph">
<p>Pour activer l&#8217;utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un <code>SecurityFilterChain</code> utilisant l&#8217;authentification OIDC.</p>
<p>Pour activer l&#8217;utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un <code>SecurityFilterChain</code> utilisant l&#8217;authentification OIDC, avec la méthode <code>oauth2Login()</code>.</p>
</div>
<div class="paragraph">
<p>Reportez vous à <a href="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean">cet exemple</a> de la documentation de Spring Security :</p>
<p>Reportez-vous à <a href="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean">cet exemple</a> de la documentation de Spring Security :</p>
</div>
<div class="listingblock">
<div class="title">OAuth2LoginSecurityConfig.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><span></span><span class="tok-nd">@Configuration</span>
<span class="tok-nd">@EnableWebSecurity</span>
<span class="tok-kd">public</span> <span class="tok-kd">class</span> <span class="tok-nc">OAuth2LoginSecurityConfig</span> <span class="tok-p">{</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><span class="nd">@Configuration</span>
<span class="nd">@EnableWebSecurity</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">OAuth2LoginSecurityConfig</span> <span class="o">{</span>
<span class="tok-nd">@Bean</span>
<span class="tok-kd">public</span> <span class="tok-n">SecurityFilterChain</span> <span class="tok-nf">filterChain</span><span class="tok-p">(</span><span class="tok-n">HttpSecurity</span> <span class="tok-n">http</span><span class="tok-p">)</span> <span class="tok-kd">throws</span> <span class="tok-n">Exception</span> <span class="tok-p">{</span>
<span class="tok-n">http</span>
<span class="tok-p">.</span><span class="tok-na">authorizeHttpRequests</span><span class="tok-p">(</span><span class="tok-n">authorize</span> <span class="tok-o">-&gt;</span> <span class="tok-n">authorize</span>
<span class="tok-p">.</span><span class="tok-na">anyRequest</span><span class="tok-p">().</span><span class="tok-na">authenticated</span><span class="tok-p">()</span>
<span class="tok-p">)</span>
<span class="tok-p">.</span><span class="tok-na">oauth2Login</span><span class="tok-p">(</span><span class="tok-n">withDefaults</span><span class="tok-p">());</span>
<span class="tok-k">return</span> <span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">build</span><span class="tok-p">();</span>
<span class="tok-p">}</span>
<span class="tok-p">}</span></code></pre>
<span class="nd">@Bean</span>
<span class="kd">public</span> <span class="nc">SecurityFilterChain</span> <span class="nf">filterChain</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">authorizeHttpRequests</span><span class="o">(</span><span class="n">authorize</span> <span class="o">-&gt;</span> <span class="n">authorize</span>
<span class="o">.</span><span class="na">anyRequest</span><span class="o">().</span><span class="na">authenticated</span><span class="o">()</span>
<span class="o">)</span>
<span class="o">.</span><span class="na">oauth2Login</span><span class="o">(</span><span class="n">withDefaults</span><span class="o">());</span>
<span class="k">return</span> <span class="n">http</span><span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span></code></pre>
</div>
</div>
</div>
......@@ -1401,21 +1451,20 @@ Cette partie est moins guidée. Reportez-vous au cours !
<div class="listingblock">
<div class="title">filename.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><span></span><span class="tok-nd">@Bean</span>
<span class="tok-kd">public</span> <span class="tok-n">SecurityFilterChain</span> <span class="tok-nf">filterChain</span><span class="tok-p">(</span><span class="tok-n">HttpSecurity</span> <span class="tok-n">http</span><span class="tok-p">)</span> <span class="tok-kd">throws</span> <span class="tok-n">Exception</span> <span class="tok-p">{</span>
<span class="tok-n">http</span>
<span class="tok-p">.</span><span class="tok-na">csrf</span><span class="tok-p">(</span><span class="tok-n">Customizer</span><span class="tok-p">.</span><span class="tok-na">withDefaults</span><span class="tok-p">())</span>
<span class="tok-p">.</span><span class="tok-na">authorizeHttpRequests</span><span class="tok-p">(</span><span class="tok-n">authorize</span> <span class="tok-o">-&gt;</span> <span class="tok-p">{</span>
<span class="tok-n">authorize</span><span class="tok-p">.</span><span class="tok-na">anyRequest</span><span class="tok-p">().</span><span class="tok-na">authenticated</span><span class="tok-p">();</span>
<span class="tok-p">})</span>
<span class="tok-p">.</span><span class="tok-na">oauth2Login</span><span class="tok-p">(</span><span class="tok-n">customize</span> <span class="tok-o">-&gt;</span> <span class="tok-p">{</span>
<span class="tok-n">customize</span><span class="tok-p">.</span><span class="tok-na">successHandler</span><span class="tok-p">((</span><span class="tok-n">request</span><span class="tok-p">,</span> <span class="tok-n">response</span><span class="tok-p">,</span> <span class="tok-n">authentication</span><span class="tok-p">)</span> <span class="tok-o">-&gt;</span> <span class="tok-p">{</span>
<span class="tok-c1">// create a Trainer here if it does not exists</span>
<span class="tok-n">System</span><span class="tok-p">.</span><span class="tok-na">out</span><span class="tok-p">.</span><span class="tok-na">println</span><span class="tok-p">(</span><span class="tok-n">authentication</span><span class="tok-p">.</span><span class="tok-na">getName</span><span class="tok-p">()</span> <span class="tok-o">+</span> <span class="tok-s">&quot; is connected !&quot;</span><span class="tok-p">);</span>
<span class="tok-p">});</span>
<span class="tok-p">});</span>
<span class="tok-k">return</span> <span class="tok-n">http</span><span class="tok-p">.</span><span class="tok-na">build</span><span class="tok-p">();</span>
<span class="tok-p">}</span></code></pre>
<pre class="rouge highlight nowrap"><code data-lang="java"><span class="nd">@Bean</span>
<span class="kd">public</span> <span class="nc">SecurityFilterChain</span> <span class="nf">filterChain</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">authorizeHttpRequests</span><span class="o">(</span><span class="n">authorize</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="n">authorize</span><span class="o">.</span><span class="na">anyRequest</span><span class="o">().</span><span class="na">authenticated</span><span class="o">();</span>
<span class="o">})</span>
<span class="o">.</span><span class="na">oauth2Login</span><span class="o">(</span><span class="n">customize</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="n">customize</span><span class="o">.</span><span class="na">successHandler</span><span class="o">((</span><span class="n">request</span><span class="o">,</span> <span class="n">response</span><span class="o">,</span> <span class="n">authentication</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="c1">// create a Trainer here if it does not exists</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">authentication</span><span class="o">.</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">" is connected !"</span><span class="o">);</span>
<span class="o">});</span>
<span class="o">});</span>
<span class="k">return</span> <span class="n">http</span><span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="o">}</span></code></pre>
</div>
</div>
<div class="paragraph">
......@@ -1425,10 +1474,10 @@ Cette partie est moins guidée. Reportez-vous au cours !
<p>Nous souhaitons créer une page "Mon profil" pour nos dresseurs de Pokemon.</p>
</div>
<div class="paragraph">
<p>Sur cette page, ils pourraient lister leurs pokemons.</p>
<p>Sur cette page, ils pourraient lister leurs Pokemons.</p>
</div>
<div class="paragraph">
<p>Cette page pourrait être disponible à l&#8217;url <a href="http://localhost:9000/profile" class="bare" target="_blank" rel="noopener">http://localhost:9000/profile</a> et ressembler à ça :</p>
<p>Cette page pourrait être disponible à l&#8217;URL <a href="http://localhost:9000/profile" class="bare" target="_blank" rel="noopener">http://localhost:9000/profile</a> et ressembler à ça :</p>
</div>
<div class="imageblock">
<div class="content">
......@@ -1483,60 +1532,61 @@ C&#8217;est plus propre que de faire de l&#8217;héritage :)</p>
<div class="listingblock">
<div class="title">fr.univ_lille.alom.game_ui.trainers.ConnectedTrainerControllerAdviceTest.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span></pre></div></td><td class="code"><pre><span></span><span class="tok-kn">package</span> <span class="tok-nn">fr.univ_lille.alom.game_ui.trainers</span><span class="tok-p">;</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre><span class="kn">package</span> <span class="nn">fr.univ_lille.alom.game_ui.trainers</span><span class="o">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.junit.jupiter.api.Test</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.security.core.Authentication</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.security.core.context.SecurityContextHolder</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.security.core.userdetails.User</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.web.bind.annotation.ControllerAdvice</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.web.bind.annotation.ModelAttribute</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">org.junit.jupiter.api.Test</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.security.core.Authentication</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.security.core.context.SecurityContextHolder</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.security.core.userdetails.User</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.web.bind.annotation.ControllerAdvice</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.web.bind.annotation.ModelAttribute</span><span class="o">;</span>
<span class="tok-kn">import static</span> <span class="tok-nn">org.junit.jupiter.api.Assertions.*</span><span class="tok-p">;</span>
<span class="tok-kn">import static</span> <span class="tok-nn">org.mockito.Mockito.mock</span><span class="tok-p">;</span>
<span class="tok-kn">import static</span> <span class="tok-nn">org.mockito.Mockito.when</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">junit</span><span class="o">.</span><span class="na">jupiter</span><span class="o">.</span><span class="na">api</span><span class="o">.</span><span class="na">Assertions</span><span class="o">.*;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">mockito</span><span class="o">.</span><span class="na">Mockito</span><span class="o">.</span><span class="na">mock</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">mockito</span><span class="o">.</span><span class="na">Mockito</span><span class="o">.</span><span class="na">when</span><span class="o">;</span>
<span class="tok-kd">class</span> <span class="tok-nc">ConnectedTrainerControllerAdviceTest</span> <span class="tok-p">{</span>
<span class="kd">class</span> <span class="nc">ConnectedTrainerControllerAdviceTest</span> <span class="o">{</span>
<span class="tok-nd">@Test</span>
<span class="tok-kt">void</span> <span class="tok-nf">connectedTrainerControllerAdviceTest_shouldBeAControllerAdvice</span><span class="tok-p">()</span> <span class="tok-p">{</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">ConnectedTrainerControllerAdvice</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">.</span><span class="tok-na">getAnnotation</span><span class="tok-p">(</span><span class="tok-n">ControllerAdvice</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">));</span>
<span class="tok-p">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">connectedTrainerControllerAdviceTest_shouldBeAControllerAdvice</span><span class="o">()</span> <span class="o">{</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="nc">ConnectedTrainerControllerAdvice</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getAnnotation</span><span class="o">(</span><span class="nc">ControllerAdvice</span><span class="o">.</span><span class="na">class</span><span class="o">));</span>
<span class="o">}</span>
<span class="tok-nd">@Test</span>
<span class="tok-kt">void</span> <span class="tok-nf">connectedTrainer_shouldUseModelAttribute</span><span class="tok-p">()</span> <span class="tok-kd">throws</span> <span class="tok-n">NoSuchMethodException</span> <span class="tok-p">{</span>
<span class="tok-kd">var</span> <span class="tok-n">connectedTrainerMethod</span> <span class="tok-o">=</span> <span class="tok-n">ConnectedTrainerControllerAdvice</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">.</span><span class="tok-na">getDeclaredMethod</span><span class="tok-p">(</span><span class="tok-s">&quot;connectedTrainer&quot;</span><span class="tok-p">);</span>
<span class="tok-kd">var</span> <span class="tok-n">annotation</span> <span class="tok-o">=</span> <span class="tok-n">connectedTrainerMethod</span><span class="tok-p">.</span><span class="tok-na">getAnnotation</span><span class="tok-p">(</span><span class="tok-n">ModelAttribute</span><span class="tok-p">.</span><span class="tok-na">class</span><span class="tok-p">);</span>
<span class="tok-n">assertNotNull</span><span class="tok-p">(</span><span class="tok-n">annotation</span><span class="tok-p">);</span>
<span class="tok-p">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">connectedTrainer_shouldUseModelAttribute</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">NoSuchMethodException</span> <span class="o">{</span>
<span class="kt">var</span> <span class="n">connectedTrainerMethod</span> <span class="o">=</span> <span class="nc">ConnectedTrainerControllerAdvice</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getDeclaredMethod</span><span class="o">(</span><span class="s">"connectedTrainer"</span><span class="o">);</span>
<span class="kt">var</span> <span class="n">annotation</span> <span class="o">=</span> <span class="n">connectedTrainerMethod</span><span class="o">.</span><span class="na">getAnnotation</span><span class="o">(</span><span class="nc">ModelAttribute</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="n">assertNotNull</span><span class="o">(</span><span class="n">annotation</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
</div>
......@@ -1548,46 +1598,47 @@ C&#8217;est plus propre que de faire de l&#8217;héritage :)</p>
<div class="listingblock">
<div class="title">SecurityControllerAdvice.java</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="java"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span></pre></div></td><td class="code"><pre><span></span><span class="tok-kn">package</span> <span class="tok-nn">com.miage.alom.tp.game_ui.controller</span><span class="tok-p">;</span>
<pre class="rouge highlight nowrap"><code data-lang="java"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre><span class="kn">package</span> <span class="nn">com.miage.alom.tp.game_ui.controller</span><span class="o">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.security.core.context.SecurityContextHolder</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.security.core.userdetails.User</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.web.bind.annotation.ControllerAdvice</span><span class="tok-p">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">org.springframework.web.bind.annotation.ModelAttribute</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.security.core.context.SecurityContextHolder</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.security.core.userdetails.User</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.web.bind.annotation.ControllerAdvice</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.springframework.web.bind.annotation.ModelAttribute</span><span class="o">;</span>
<span class="tok-kn">import</span> <span class="tok-nn">java.security.Principal</span><span class="tok-p">;</span>
<span class="kn">import</span> <span class="nn">java.security.Principal</span><span class="o">;</span>
<i class="conum" data-value="1"></i><b>(1)</b>
<span class="tok-kd">public</span> <span class="tok-kd">class</span> <span class="tok-nc">ConnectedTrainerControllerAdvice</span> <span class="tok-p">{</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ConnectedTrainerControllerAdvice</span> <span class="o">{</span>
<i class="conum" data-value="2"></i><b>(2)</b>
<i class="conum" data-value="3"></i><b>(3)</b>
<span class="tok-n">Trainer</span> <span class="tok-nf">connectedTrainer</span><span class="tok-p">(){</span>
<span class="nc">Trainer</span> <span class="nf">connectedTrainer</span><span class="o">(){</span>
<i class="conum" data-value="4"></i><b>(4)</b>
<span class="tok-p">}</span>
<span class="o">}</span>
<span class="tok-p">}</span>
</pre></td></tr></table></code></pre>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
<div class="colist arabic">
......@@ -1620,7 +1671,7 @@ C&#8217;est plus propre que de faire de l&#8217;héritage :)</p>
<div class="listingblock">
<div class="title">application.properties</div>
<div class="content">
<pre class="pygments highlight nowrap"><code><span></span>spring.mustache.servlet.expose-request-attributes=true</code></pre>
<pre class="rouge highlight nowrap"><code>spring.mustache.servlet.expose-request-attributes=true</code></pre>
</div>
</div>
<div class="paragraph">
......@@ -1633,72 +1684,73 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
<div class="listingblock">
<div class="title">navbar.html (ici en bootstrap, utilisez le framework CSS que vous préférez !)</div>
<div class="content">
<pre class="pygments highlight nowrap"><code data-lang="html"><table class="linenotable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span></pre></div></td><td class="code"><pre><span></span><span class="tok-p">&lt;</span><span class="tok-nt">nav</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;navbar navbar-expand-lg navbar-light bg-light&quot;</span><span class="tok-p">&gt;</span>
<pre class="rouge highlight nowrap"><code data-lang="html"><table class="linenotable"><tbody><tr><td class="linenos gl"><pre class="lineno"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre><span class="nt">&lt;nav</span> <span class="na">class=</span><span class="s">"navbar navbar-expand-lg navbar-light bg-light"</span><span class="nt">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">ul</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;navbar-nav mr-auto&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">li</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-item&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">a</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-link&quot;</span> <span class="tok-na">href</span><span class="tok-o">=</span><span class="tok-s">&quot;pokedex&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">img</span> <span class="tok-na">src</span><span class="tok-o">=</span><span class="tok-s">&quot;/icons/pokedex.png&quot;</span> <span class="tok-na">width</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">height</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;d-inline-block align-top&quot;</span> <span class="tok-na">alt</span><span class="tok-o">=</span><span class="tok-s">&quot;&quot;</span><span class="tok-p">&gt;</span>
<span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">"navbar-nav mr-auto"</span><span class="nt">&gt;</span>
<span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
<span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">"nav-link"</span> <span class="na">href=</span><span class="s">"pokedex"</span><span class="nt">&gt;</span>
<span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"/icons/pokedex.png"</span> <span class="na">width=</span><span class="s">"30"</span> <span class="na">height=</span><span class="s">"30"</span> <span class="na">class=</span><span class="s">"d-inline-block align-top"</span> <span class="na">alt=</span><span class="s">""</span><span class="nt">&gt;</span>
Pokedex
<span class="tok-p">&lt;/</span><span class="tok-nt">a</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">li</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">li</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-item&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">a</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-link&quot;</span> <span class="tok-na">href</span><span class="tok-o">=</span><span class="tok-s">&quot;trainers&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">img</span> <span class="tok-na">src</span><span class="tok-o">=</span><span class="tok-s">&quot;/icons/player.png&quot;</span> <span class="tok-na">width</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">height</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;d-inline-block align-top&quot;</span> <span class="tok-na">alt</span><span class="tok-o">=</span><span class="tok-s">&quot;&quot;</span><span class="tok-p">&gt;</span>
<span class="nt">&lt;/a&gt;</span>
<span class="nt">&lt;/li&gt;</span>
<span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
<span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">"nav-link"</span> <span class="na">href=</span><span class="s">"trainers"</span><span class="nt">&gt;</span>
<span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"/icons/player.png"</span> <span class="na">width=</span><span class="s">"30"</span> <span class="na">height=</span><span class="s">"30"</span> <span class="na">class=</span><span class="s">"d-inline-block align-top"</span> <span class="na">alt=</span><span class="s">""</span><span class="nt">&gt;</span>
Trainers
<span class="tok-p">&lt;/</span><span class="tok-nt">a</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">li</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">ul</span><span class="tok-p">&gt;</span>
<span class="nt">&lt;/a&gt;</span>
<span class="nt">&lt;/li&gt;</span>
<span class="nt">&lt;/ul&gt;</span>
{{#connectedTrainer}}
<span class="tok-p">&lt;</span><span class="tok-nt">span</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;navbar-text mr-md-3&quot;</span><span class="tok-p">&gt;</span>Welcome {{name}}<span class="tok-p">&lt;/</span><span class="tok-nt">span</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">ul</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;navbar-nav&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">li</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-item&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">a</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;nav-link&quot;</span> <span class="tok-na">href</span><span class="tok-o">=</span><span class="tok-s">&quot;profile&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">img</span> <span class="tok-na">src</span><span class="tok-o">=</span><span class="tok-s">&quot;/icons/player.png&quot;</span> <span class="tok-na">width</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">height</span><span class="tok-o">=</span><span class="tok-s">&quot;30&quot;</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;d-inline-block align-top&quot;</span> <span class="tok-na">alt</span><span class="tok-o">=</span><span class="tok-s">&quot;&quot;</span><span class="tok-p">&gt;</span>
<span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">"navbar-text mr-md-3"</span><span class="nt">&gt;</span>Welcome {{name}}<span class="nt">&lt;/span&gt;</span>
<span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">"navbar-nav"</span><span class="nt">&gt;</span>
<span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
<span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">"nav-link"</span> <span class="na">href=</span><span class="s">"profile"</span><span class="nt">&gt;</span>
<span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"/icons/player.png"</span> <span class="na">width=</span><span class="s">"30"</span> <span class="na">height=</span><span class="s">"30"</span> <span class="na">class=</span><span class="s">"d-inline-block align-top"</span> <span class="na">alt=</span><span class="s">""</span><span class="nt">&gt;</span>
My Profile
<span class="tok-p">&lt;/</span><span class="tok-nt">a</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">li</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">ul</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">form</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;form-inline&quot;</span> <span class="tok-na">action</span><span class="tok-o">=</span><span class="tok-s">&quot;/logout&quot;</span> <span class="tok-na">method</span><span class="tok-o">=</span><span class="tok-s">&quot;post&quot;</span><span class="tok-p">&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">input</span> <span class="tok-na">type</span><span class="tok-o">=</span><span class="tok-s">&quot;submit&quot;</span> <span class="tok-na">class</span><span class="tok-o">=</span><span class="tok-s">&quot;btn btn-outline-warning my-2 my-sm-0&quot;</span> <span class="tok-na">value</span><span class="tok-o">=</span><span class="tok-s">&quot;Sign Out&quot;</span><span class="tok-p">/&gt;</span>
<span class="tok-p">&lt;</span><span class="tok-nt">input</span> <span class="tok-na">type</span><span class="tok-o">=</span><span class="tok-s">&quot;hidden&quot;</span> <span class="tok-na">name</span><span class="tok-o">=</span><span class="tok-s">&quot;{{_csrf.parameterName}}&quot;</span> <span class="tok-na">value</span><span class="tok-o">=</span><span class="tok-s">&quot;{{_csrf.token}}&quot;</span><span class="tok-p">/&gt;</span>
<span class="tok-p">&lt;/</span><span class="tok-nt">form</span><span class="tok-p">&gt;</span>
<span class="nt">&lt;/a&gt;</span>
<span class="nt">&lt;/li&gt;</span>
<span class="nt">&lt;/ul&gt;</span>
<span class="nt">&lt;form</span> <span class="na">class=</span><span class="s">"form-inline"</span> <span class="na">action=</span><span class="s">"/logout"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">&gt;</span>
<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">class=</span><span class="s">"btn btn-outline-warning my-2 my-sm-0"</span> <span class="na">value=</span><span class="s">"Sign Out"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"{{_csrf.parameterName}}"</span> <span class="na">value=</span><span class="s">"{{_csrf.token}}"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/form&gt;</span>
{{/connectedTrainer}}
<span class="tok-p">&lt;/</span><span class="tok-nt">nav</span><span class="tok-p">&gt;</span>
</pre></td></tr></table></code></pre>
<span class="nt">&lt;/nav&gt;</span>
</pre></td></tr></tbody></table></code></pre>
</div>
</div>
</div>
......@@ -1711,7 +1763,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
<div class="ulist">
<ul>
<li>
<p>implémentez un flow d&#8217;inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ)</p>
<p>implémentez un flow d&#8217;inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ) :</p>
<div class="ulist">
<ul>
<li>
......@@ -1721,7 +1773,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
</div>
</li>
<li>
<p>une fois un joueur connecté, il peut choisir l&#8217;un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ.</p>
<p>une fois un joueur connecté, il peut choisir l&#8217;un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ, s&#8217;il ne possède pas encore de Pokémon dans son équipe</p>
</li>
<li>
<p>la dernière étape de son inscription consiste à faire un <code>POST</code> sur l&#8217;API Trainers, pour modifier le Trainer du joueur en base de données.</p>
......@@ -1733,7 +1785,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
</div>
<div id="footer">
<div id="footer-text">
Last updated 2024-10-30 15:36:38 +0100
Last updated 2024-11-06 06:52:04 +0100
</div>
</div>
<script type="text/x-mathjax-config">
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment