{"componentChunkName":"component---src-templates-blog-post-js","path":"/spring-security-jwt/","result":{"data":{"markdownRemark":{"html":"<p>Implementar segurança em aplicações não é algo simples e requer atenção em muitos detalhes.</p>\n<p>Pensando nisso o <strong>Spring Security</strong> surgiu para descomplicar muitos pontos e juntamente com o <strong>Spring Boot</strong> deixou o desenvolvimento de aplicações seguras muito mais produtivo e descomplicado, nesse post iremos implementar em uma aplicação uma <strong>API REST</strong> para autenticação e geração de um token <strong>JWT</strong> para completar as requisições de forma segura.</p>\n<h2 id=\"Criando-o-projeto\" style=\"position:relative;\">Criando o projeto<a href=\"#Criando-o-projeto\" aria-label=\"Criando o projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Usando o site <a href=\"https://start.spring.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">spring initializr</a> criamos um projeto base e já adicionamos as dependências do <strong>Spring Security</strong>, <strong>Spring Web</strong> e adicionamos a dependência do <strong>Json Web Token</strong>; como estamos criando um projeto <strong>Maven</strong> o <em>pom.xml</em> ficará assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token prolog\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>project</span> <span class=\"token attr-name\">xmlns</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://maven.apache.org/POM/4.0.0<span class=\"token punctuation\">\"</span></span>\n\t<span class=\"token attr-name\"><span class=\"token namespace\">xmlns:</span>xsi</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://www.w3.org/2001/XMLSchema-instance<span class=\"token punctuation\">\"</span></span>\n\t<span class=\"token attr-name\"><span class=\"token namespace\">xsi:</span>schemaLocation</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>modelVersion</span><span class=\"token punctuation\">></span></span>4.0.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>modelVersion</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>parent</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-parent<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>2.4.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>relativePath</span> <span class=\"token punctuation\">/></span></span> <span class=\"token comment\">&lt;!-- lookup parent from repository --></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>parent</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>com.irs.register<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>register<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>0.0.1-SNAPSHOT<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>name</span><span class=\"token punctuation\">></span></span>register<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>name</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>description</span><span class=\"token punctuation\">></span></span>Register Service<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>description</span><span class=\"token punctuation\">></span></span>\n\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>properties</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>java.version</span><span class=\"token punctuation\">></span></span>11<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>java.version</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>properties</span><span class=\"token punctuation\">></span></span>\n\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependencies</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-actuator<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-security<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-web<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-data-jpa<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>mysql<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>mysql-connector-java<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>8.0.22<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-devtools<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>scope</span><span class=\"token punctuation\">></span></span>runtime<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>scope</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>optional</span><span class=\"token punctuation\">></span></span>true<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>optional</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.projectlombok<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>lombok<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>optional</span><span class=\"token punctuation\">></span></span>true<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>optional</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>scope</span><span class=\"token punctuation\">></span></span>test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>scope</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.security<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-security-test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>scope</span><span class=\"token punctuation\">></span></span>test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>scope</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>io.jsonwebtoken<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>jjwt<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>0.9.1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependencies</span><span class=\"token punctuation\">></span></span>\n\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>build</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugins</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</span><span class=\"token punctuation\">></span></span>\n\t\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n\t\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-maven-plugin<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n\t\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugin</span><span class=\"token punctuation\">></span></span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugins</span><span class=\"token punctuation\">></span></span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>build</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>project</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>No nosso <em>pom.xml</em> podemos ver além das dependências que foram mencionadas a cima, as dependências do <strong>Lombok</strong>, <strong>Spring Data</strong>, <strong>Actuator</strong> e <strong>DevTools</strong> que irão ajudar no desenvolvimento.</p>\n<h2 id=\"Habilitando-o-contexto-de-seguranca\" style=\"position:relative;\">Habilitando o contexto de segurança<a href=\"#Habilitando-o-contexto-de-seguranca\" aria-label=\"Habilitando o contexto de seguranca permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Para começarmos a configurar o <strong>Spring Security</strong> vamos criar uma classe e adicionaremos as anotações <code class=\"language-text\">@EnableWebSecurity</code> e <code class=\"language-text\">@Configuration</code> para que ela seja carregada e esteja configurada no inicio da aplicação. Além disso estendemos a classe <strong>WebSecurityConfigurerAdapter</strong> que expõe três métodos para fazer as configurações necessárias:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SecurityConfiguration</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">WebSecurityConfigurerAdapter</span> <span class=\"token punctuation\">{</span>\n\t\n    <span class=\"token comment\">//Configurations for authentication</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">AuthenticationManagerBuilder</span> auth<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">//Configuration for authorization</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpSecurity</span> http<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">//Configuration for static resources</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">WebSecurity</span> web<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Podemos observar que temos três métodos chamados <em>configure</em> mas que recebem parâmetros diferentes:</p>\n<ul>\n<li>O primeiro <em>configure</em> que recebe <strong>AuthenticationManagerBuilder</strong> é o método que será usado para configurar a autenticação.</li>\n<li>O segundo <em>configure</em> que recebe <strong>HttpSecurity</strong> é para a autorização das requisições.</li>\n<li>O terceiro <em>configure</em> que recebe <strong>WebSecurity</strong> é para arquivos estáticos como CSS, JS, HTML, mas não usaremos nesse exemplo pois estamos criando uma <strong>API REST</strong>.</li>\n</ul>\n<p>Como estamos usando o <strong>Actuator</strong> já recebemos alguns endpoints para monitorar a saúde da nossa aplicação, entre eles temos o <code class=\"language-text\">/actuator/health</code> que retorna se a aplicação está no ar ou instável, se iniciarmos a aplicação e tentarmos acessar esse endpoint receberemos a seguinte mensagem:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"timestamp\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2020-12-11T22:29:51.654+00:00\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span> <span class=\"token number\">403</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"error\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Forbidden\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"message\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Access Denied\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"path\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/actuator/health\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><img src=\"https://media.giphy.com/media/l2YWhVXNyqH5HuAY8/giphy.gif\" alt=\"BLOCK!!!\"></p>\n<p>Recebemos o status code <strong>403 Forbidden</strong> nos indicando que a url não pode ser acessada pois o acesso foi negado.</p>\n<h2 id=\"Configurando-Endpoint-de-Autenticacao\" style=\"position:relative;\">Configurando Endpoint de Autenticação<a href=\"#Configurando-Endpoint-de-Autenticacao\" aria-label=\"Configurando Endpoint de Autenticacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Já temos as urls protegidas, agora vamos configurar a autenticação. Primeiramente vamos criar um <strong>Controller</strong> que receba uma requisição de login de um usuário:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/auth\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AuthenticationController</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">AuthenticationManager</span> authenticationManager<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">TokenService</span> tokenService<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token annotation punctuation\">@PostMapping</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TokenDTO</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">auth</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token annotation punctuation\">@Validated</span> <span class=\"token class-name\">LoginDTO</span> loginDTO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">UsernamePasswordAuthenticationToken</span> usernamePasswordAuthenticationToken <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">UsernamePasswordAuthenticationToken</span><span class=\"token punctuation\">(</span>loginDTO<span class=\"token punctuation\">.</span><span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> loginDTO<span class=\"token punctuation\">.</span><span class=\"token function\">getPass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">Authentication</span> authentication <span class=\"token operator\">=</span> authenticationManager<span class=\"token punctuation\">.</span><span class=\"token function\">authenticate</span><span class=\"token punctuation\">(</span>usernamePasswordAuthenticationToken<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">String</span> token <span class=\"token operator\">=</span> tokenService<span class=\"token punctuation\">.</span><span class=\"token function\">generateToken</span><span class=\"token punctuation\">(</span>authentication<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TokenDTO</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">type</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Bearer\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">token</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse <strong>Controller</strong> é um endpoint <strong>REST</strong> mapeado para <em>/auth</em> que tem uma entrada do tipo <strong>POST</strong> que recebe um objeto do tipo <strong>LoginDTO</strong> que possui o <strong>email</strong> e a <strong>senha</strong> e realiza a autenticação e devolve o <strong>token</strong> de acesso, podemos ver que já existem as classes de serviço do token e de autenticação, mais detalhes a diante.</p>\n<p>Se tentarmos fazer um requisição do tipo <strong>POST</strong> com um usuário e senha vamos tomar um erro <strong>403 Forbidden</strong> mas por que isso acontece?</p>\n<p><img src=\"https://media.giphy.com/media/l14qxlCgJ0zUk/giphy.gif\" alt=\"Hummm???\"></p>\n<p>Bom antes de mais nada devemos voltar para a nossa classe <strong>SecurityConfiguration</strong> e precisamos configurar quais rotas serão protegidas e quais rotas podem estar disponíveis, como é o caso da rota de login que deve estar aberta pois sem ela não há como um usuário se autenticar, vamos colocar também a configuração de sessão. Como estamos estamos usando a estratégia de token a configuração de sessão será <strong>STATELESS</strong> que significa que não será guardado estado como era feito antigamente, onde um usuário logado ficava com seus dados guardados no servidor e era enviado algum tipo de identificador, <strong>Cookie</strong>, para o client ou front-end para que nas próximas requisições fosse enviado esse <strong>Cookie</strong> para o servidor e ele saber quem é aquele usuário.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token comment\">//Configuration for authorization</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpSecurity</span> http<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n        http<span class=\"token punctuation\">.</span><span class=\"token function\">authorizeRequests</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">antMatchers</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">,</span> <span class=\"token string\">\"/auth\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">permitAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">anyRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">authenticated</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">csrf</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">disable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">sessionManagement</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sessionCreationPolicy</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SessionCreationPolicy</span><span class=\"token punctuation\">.</span>STATELESS<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>O objeto <strong>HttpSecurity</strong> possui uma <em>API fluída</em> o que significa que os métodos podem ser chamados em sequência e essa sequência forma uma frase explícita da intenção.</p>\n<p>Lendo o código a cima temos a seguinte intenção: <em>Autorize, os requests com o padrão /auth são permitidos, qualquer outro é necessário estar autenticado, desabilite a política CSRF e no gerenciamento de sessão use a política STATELESS</em></p>\n<p><em>Obs: CSRF (Cross-site request forgery) ou XSRF é tipo de ataque na web porém para o tipo de autenticação com web token estamos livre desse tipo de problema.</em></p>\n<h2 id=\"Configuracao-de-autenticacao\" style=\"position:relative;\">Configuração de autenticação<a href=\"#Configuracao-de-autenticacao\" aria-label=\"Configuracao de autenticacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Feito isso podemos chamar o nosso endpoint porém ainda é necessário fazer mais configurações pois temos que criar as classes de serviços para fazer a autenticação.</p>\n<p>Voltando para o <strong>Controller</strong> temos duas classes sendo injetadas</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">AuthenticationManager</span> authenticationManager<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">TokenService</span> tokenService<span class=\"token punctuation\">;</span></code></pre></div>\n<p>A primeira é uma classe do próprio <strong>Spring Security</strong> e só injetaremos ela aqui mas precisamos fazer as configurações pertinentes a ela lá na nossa classe de configuração no método <strong>configure</strong> que recebe um objeto do tipo <strong>AuthenticationManagerBuilder</strong> e é o método responsável por lidar com a autenticação:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">AuthenticationService</span> authenticationService<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">//Configurations for authentication</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">AuthenticationManagerBuilder</span> auth<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    \tauth<span class=\"token punctuation\">.</span><span class=\"token function\">userDetailsService</span><span class=\"token punctuation\">(</span>authenticationService<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">passwordEncoder</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">BCryptPasswordEncoder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse método será chamado durante a autenticação e para validação dos dados de usuário irá chamar a classe <strong>AuthenticationService</strong>, importante também verificar que estamos usando um <em>encoder</em> para o nosso password pois não queremos ser capazes de armazenar o password em texto simples, mas para entender melhor precisamos entrar nessa classe de serviço e verificar o que é feito.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AuthenticationService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">UserDetailsService</span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">UserRepositoryPort</span> repository<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">UserDetails</span> <span class=\"token function\">loadUserByUsername</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> username<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">UsernameNotFoundException</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">></span></span> optional <span class=\"token operator\">=</span> repository<span class=\"token punctuation\">.</span><span class=\"token function\">findByEmail</span><span class=\"token punctuation\">(</span>username<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>optional<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">return</span> optional<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">UsernameNotFoundException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"User not found\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\t\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A primeira coisa que percebemos é que essa classe implementa a interface <strong>UserDetailsService</strong> que possui o método <em>loadUserByUsername</em> e devolve um objeto do tipo <strong>UserDetails</strong>.</p>\n<p>O que basicamente acontece aqui é que ele vai buscar em algum repositório por esse usuário e verificar se ele existe e devolver para o processo de autenticação, mas ainda não temos nada disso criado, então vamos criar o nosso repositório agora.</p>\n<h1 id=\"Criando-Repositorio-para-autenticacao\" style=\"position:relative;\">Criando Repositório para autenticação<a href=\"#Criando-Repositorio-para-autenticacao\" aria-label=\"Criando Repositorio para autenticacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h1>\n<p>O repositório será um banco de dados que armazena os usuários dessa aplicação, então segue o mapeamento da classe <strong>User</strong> que implementa a classe <strong>UserDetails</strong> do <strong>Spring Security</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token annotation punctuation\">@AllArgsConstructor</span>\n<span class=\"token annotation punctuation\">@NoArgsConstructor</span>\n<span class=\"token annotation punctuation\">@Entity</span>\n<span class=\"token annotation punctuation\">@Table</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"User\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">UserDetails</span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token comment\">/**\n\t * \n\t */</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">long</span> serialVersionUID <span class=\"token operator\">=</span> <span class=\"token number\">1L</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Id</span> <span class=\"token annotation punctuation\">@GeneratedValue</span><span class=\"token punctuation\">(</span>strategy <span class=\"token operator\">=</span> <span class=\"token class-name\">GenerationType</span><span class=\"token punctuation\">.</span>IDENTITY<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> pass<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token annotation punctuation\">@ManyToMany</span><span class=\"token punctuation\">(</span>fetch <span class=\"token operator\">=</span> <span class=\"token class-name\">FetchType</span><span class=\"token punctuation\">.</span>EAGER<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Set</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Perfil</span><span class=\"token punctuation\">></span></span> perfis<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Collection</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">GrantedAuthority</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAuthorities</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>perfis<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getPassword</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pass<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getUsername</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isAccountNonExpired</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isAccountNonLocked</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isCredentialsNonExpired</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isEnabled</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O fato de implementarmos <strong>UserDetails</strong> faz com que implementemos alguns métodos para fazer a checagem se o usuário existe e se ele pode se autenticar. Também é necessário informar as permissões de acesso para esse usuário através do método <em>getAuthorities</em> e para fazer esse mapeamento foi criado a classe <strong>Perfil</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token annotation punctuation\">@AllArgsConstructor</span>\n<span class=\"token annotation punctuation\">@NoArgsConstructor</span>\n<span class=\"token annotation punctuation\">@Entity</span>\n<span class=\"token annotation punctuation\">@Table</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Perfil\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Perfil</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">GrantedAuthority</span><span class=\"token punctuation\">{</span>\n\t\n\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">long</span> serialVersionUID <span class=\"token operator\">=</span> <span class=\"token number\">1L</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Id</span> <span class=\"token annotation punctuation\">@GeneratedValue</span><span class=\"token punctuation\">(</span>strategy <span class=\"token operator\">=</span> <span class=\"token class-name\">GenerationType</span><span class=\"token punctuation\">.</span>IDENTITY<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getAuthority</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essa classe por sua vez implementa a interface <strong>GrantedAuthority</strong> que representa as permissões concedidas para um usuário.</p>\n<p>Agora criamos a interface que será o serviço de <strong>Repository</strong> para buscar essas informações:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Repository</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">UserRepository</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">CrudRepository</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Integer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findByEmail</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com isso agora a nossa classe <strong>AuthenticationService</strong> vai funcionar quando for chamada em uma requisição com usuário e senha.</p>\n<h1 id=\"Devolvendo-JSON-Web-Token\" style=\"position:relative;\">Devolvendo JSON Web Token<a href=\"#Devolvendo-JSON-Web-Token\" aria-label=\"Devolvendo JSON Web Token permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h1>\n<p>Após a autenticação ser efetuada o nosso <strong>Controller</strong> irá retornar o <strong>JWT</strong> para que seja usado em próximas requisições, precisamos agora fazer a configuração para retornar esse token para o usuário.</p>\n<p>No <strong>Controller</strong> temos o seguinte trecho de código:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token annotation punctuation\">@PostMapping</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TokenDTO</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">auth</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token annotation punctuation\">@Validated</span> <span class=\"token class-name\">LoginDTO</span> loginDTO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">UsernamePasswordAuthenticationToken</span> usernamePasswordAuthenticationToken <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">UsernamePasswordAuthenticationToken</span><span class=\"token punctuation\">(</span>loginDTO<span class=\"token punctuation\">.</span><span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> loginDTO<span class=\"token punctuation\">.</span><span class=\"token function\">getPass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">Authentication</span> authentication <span class=\"token operator\">=</span> authenticationManager<span class=\"token punctuation\">.</span><span class=\"token function\">authenticate</span><span class=\"token punctuation\">(</span>usernamePasswordAuthenticationToken<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">String</span> token <span class=\"token operator\">=</span> tokenService<span class=\"token punctuation\">.</span><span class=\"token function\">generateToken</span><span class=\"token punctuation\">(</span>authentication<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TokenDTO</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">type</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Bearer\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">token</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui usamos a classe <strong>TokenService</strong> para gerar o token, essa classe recebe um objeto do tipo <strong>Authentication</strong> que é retornado após realizar todos os passos de autenticação.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TokenService</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${jwt.expiration}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> expiration<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${jwt.secret}\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> secret<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">generateToken</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Authentication</span> authentication<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token class-name\">User</span> usuario <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">)</span> authentication<span class=\"token punctuation\">.</span><span class=\"token function\">getPrincipal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token class-name\">Date</span> now <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token class-name\">Date</span> exp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token class-name\">Long</span><span class=\"token punctuation\">.</span><span class=\"token function\">parseLong</span><span class=\"token punctuation\">(</span>expiration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">Jwts</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setIssuer</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MinhaAplicacao\"</span><span class=\"token punctuation\">)</span>\n                             <span class=\"token punctuation\">.</span><span class=\"token function\">setSubject</span><span class=\"token punctuation\">(</span>usuario<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                             <span class=\"token punctuation\">.</span><span class=\"token function\">setIssuedAt</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t\t\t             <span class=\"token punctuation\">.</span><span class=\"token function\">setExpiration</span><span class=\"token punctuation\">(</span>exp<span class=\"token punctuation\">)</span>\n                             <span class=\"token punctuation\">.</span><span class=\"token function\">signWith</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SignatureAlgorithm</span><span class=\"token punctuation\">.</span>HS256<span class=\"token punctuation\">,</span> secret<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">compact</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui recebemos o objeto <strong>Authentication</strong> e dentro dele temos o método <em>getPrincipal</em> onde temos o nosso <strong>User</strong> e vamos devolver o nosso <strong>JWT</strong> com algumas informações:</p>\n<ul>\n<li>Issuer: Nome da aplicação que está retornando o <strong>JWT</strong>.</li>\n<li>Subject: Aqui iremos retornar o id do usuário.</li>\n<li>IssuedAt: Data de geração do token.</li>\n<li>Expiration: Data de expiração do token.</li>\n<li>SignWith: Assinatura do token com o algoritmo HmacSHA256 juntamente com o secret.</li>\n<li>Compact: Método que serializa o token.</li>\n</ul>\n<p><em>As variáveis <code class=\"language-text\">expiration</code> e <code class=\"language-text\">secret</code> foram definidas no arquivos *application.yml</em> *</p>\n<p>Com isso já teremos o retorno do <strong>JWT</strong> que pode ser usado nas próxima requests.</p>\n<h2 id=\"Autorizando-JWT\" style=\"position:relative;\">Autorizando JWT<a href=\"#Autorizando-JWT\" aria-label=\"Autorizando JWT permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora já conseguimos autenticar com usuário e senha e devolver um token para ser usado nas próximas requisições, mas precisamos configurar essa parte na aplicação.</p>\n<p>Como estamos usando gerenciamento de sessão <strong>Stateless</strong> cada requisição é “nova” para a aplicação, a aplicação não tem conhecimento que o usuário já realizou anteriormente a autenticação. Por isso usamos o token que contém informações para permitir o acesso do usuário aos recursos da aplicação.</p>\n<p><img src=\"https://media4.giphy.com/media/xT5LMAwG85SxRhYube/source.gif\" alt=\"Passport!!!\"></p>\n<p>O que podemos fazer é verificar se uma requisição que está tentando acessar algum recurso possui um token e se esse token é válido.</p>\n<p>Podemos fazer isso interceptando uma requisição.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TokenAuthenticationFilter</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">OncePerRequestFilter</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doFilterInternal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpServletRequest</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">HttpServletResponse</span> response<span class=\"token punctuation\">,</span> <span class=\"token class-name\">FilterChain</span> filterChain<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token keyword\">throws</span> <span class=\"token class-name\">ServletException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">IOException</span> <span class=\"token punctuation\">{</span>\n\n\t\tfilterChain<span class=\"token punctuation\">.</span><span class=\"token function\">doFilter</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos a classe <strong>TokenAuthenticationFilter</strong> que estende de <strong>OncePerRequestFilter</strong> que já faz a interceptação das requisições e temos o método <em>doFilterInternal</em> onde podemos manipular vários dados.</p>\n<p>Fora isso temos que informar para o <strong>Spring Security</strong> que temos um <em>Filter</em> e que ele deve ser processado em ordem, vamos voltar na classe <strong>SecurityConfiguration</strong> e adicionar no método <em>configure</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token comment\">//Configuration for authorization</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpSecurity</span> http<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n        http<span class=\"token punctuation\">.</span><span class=\"token function\">authorizeRequests</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">antMatchers</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">,</span> <span class=\"token string\">\"/auth\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">permitAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">anyRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">authenticated</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">csrf</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">disable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">sessionManagement</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sessionCreationPolicy</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SessionCreationPolicy</span><span class=\"token punctuation\">.</span>STATELESS<span class=\"token punctuation\">)</span>\n            <span class=\"token comment\">//Configuração do Filtro</span>\n        \t<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">addFilterBefore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TokenAuthenticationFilter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">UsernamePasswordAuthenticationFilter</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui adicionamos a configuração de filtro e que ele deve ser antes do filtro do <strong>Spring Security UsernamePasswordAuthenticationFilter</strong>, agora voltando para a classe de filtro precisamos configurá-la para extrair o token da requisição e validar:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doFilterInternal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpServletRequest</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">HttpServletResponse</span> response<span class=\"token punctuation\">,</span> <span class=\"token class-name\">FilterChain</span> filterChain<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token keyword\">throws</span> <span class=\"token class-name\">ServletException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">IOException</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token class-name\">String</span> token <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span><span class=\"token function\">getHeader</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Authorization\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>token <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">startsWith</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Bearer \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\ttoken <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\ttoken <span class=\"token operator\">=</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span><span class=\"token number\">7</span><span class=\"token punctuation\">,</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">length</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\tfilterChain<span class=\"token punctuation\">.</span><span class=\"token function\">doFilter</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código a cima conseguimos extrair o token do cabeçalho <em>Authorization</em> e verificamos se ele existe e se ele é um token do tipo <strong>Bearer</strong>, agora precisamos verificar se ele é válido. Para isso precisamos da <em>secret</em> que foi usada quando geramos o token então essa lógica vai ficar na classe <strong>TokenService</strong> no método <em>isValid</em> que recebe a String do token e retorna um <em>boolean</em>.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isTokenValid</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> token<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token class-name\">Jwts</span><span class=\"token punctuation\">.</span><span class=\"token function\">parser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setSigningKey</span><span class=\"token punctuation\">(</span>secret<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">parseClaimsJws</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse método faz uso da biblioteca <strong>jsonwebtoken</strong> e aqui fazemos uso do método <em>parseClaimsJws</em>, caso não consiga fazer o parse do token com a secret irá lançar uma <strong>Exception</strong>, caso não dê erro é por que o token é válido.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doFilterInternal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpServletRequest</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">HttpServletResponse</span> response<span class=\"token punctuation\">,</span> <span class=\"token class-name\">FilterChain</span> filterChain<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token keyword\">throws</span> <span class=\"token class-name\">ServletException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">IOException</span> <span class=\"token punctuation\">{</span>\n\t\t\n\t\t<span class=\"token class-name\">String</span> tokenFromHeader <span class=\"token operator\">=</span> <span class=\"token function\">getTokenFromHeader</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">boolean</span> tokenValid <span class=\"token operator\">=</span> tokenService<span class=\"token punctuation\">.</span><span class=\"token function\">isTokenValid</span><span class=\"token punctuation\">(</span>tokenFromHeader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>tokenValid<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">authenticate</span><span class=\"token punctuation\">(</span>tokenFromHeader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\tfilterChain<span class=\"token punctuation\">.</span><span class=\"token function\">doFilter</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">authenticate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> tokenFromHeader<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Integer</span> id <span class=\"token operator\">=</span> tokenService<span class=\"token punctuation\">.</span><span class=\"token function\">getTokenId</span><span class=\"token punctuation\">(</span>tokenFromHeader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">></span></span> optionalUser <span class=\"token operator\">=</span> repository<span class=\"token punctuation\">.</span><span class=\"token function\">findById</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>optionalUser<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">User</span> user <span class=\"token operator\">=</span> optionalUser<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token class-name\">UsernamePasswordAuthenticationToken</span> usernamePasswordAuthenticationToken <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">UsernamePasswordAuthenticationToken</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">.</span><span class=\"token function\">getPerfis</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token class-name\">SecurityContextHolder</span><span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setAuthentication</span><span class=\"token punctuation\">(</span>usernamePasswordAuthenticationToken<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getTokenFromHeader</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpServletRequest</span> request<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">String</span> token <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span><span class=\"token function\">getHeader</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Authorization\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>token <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">startsWith</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Bearer \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span><span class=\"token number\">7</span><span class=\"token punctuation\">,</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">length</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui acima temos o uso dos dois métodos e de mais um novo que é o <em>authenticate</em> que usa o método <em>getTokenId</em> para extrair o id que é enviado no token, no <em>Subject</em> e após isso faz uma busca por esse id no repositório. Caso encontre instânciamos um objeto <strong>UsernamePasswordAuthenticationToken</strong> passando o <em>user</em>, <em>null</em> no parâmetro da senha pois não precisamos dela nesse ponto e a lista de <em>perfis</em>. Passamos ele para o objeto <strong>SecurityContextHolder</strong> que é objeto que lida com o contexto de segurança da aplicação.</p>\n<p>Analisando a <strong>TokenService</strong> no método <em>getTokenId</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Integer</span> <span class=\"token function\">getTokenId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> token<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Claims</span> body <span class=\"token operator\">=</span> <span class=\"token class-name\">Jwts</span><span class=\"token punctuation\">.</span><span class=\"token function\">parser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setSigningKey</span><span class=\"token punctuation\">(</span>secret<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">parseClaimsJws</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">Integer</span><span class=\"token punctuation\">.</span><span class=\"token function\">valueOf</span><span class=\"token punctuation\">(</span>body<span class=\"token punctuation\">.</span><span class=\"token function\">getSubject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Vemos que aqui novamente fazemos uso da biblioteca <strong>jsonwebtoken</strong> mas agora pegamos o <em>body</em> para recuperar o <em>Subject</em>.</p>\n<p>Após iniciarmos a aplicação e autenticarmos com um usuário já cadastrado conseguimos acessar a rota que o <strong>Actuator</strong> expõe e até o momento estava inacessível. </p>\n<p>Aqui fazemos a autenticação e recebemos o token na resposta.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 39.877300613496935%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA6klEQVQoz52Ra27EIAyEuf+P3qYX6CF6izQQME/D1CZklZW2rVSkTzEDsScT45zDcRzYtg3OWXipvfc3AkJ4zSFnLQW8f0a8fdDsY1JKiESgGKcQ3A6igCh6Eo1rwRgQxo9wH2jc0RNJw1yQxIn1CZQqeu83GONp/xq9o1O5NRgZPjdjFuf6y9EFrndWqZJJkZBLQSlZKOh8uvq9kbjhhtoqykKjYf1kt3/BWYvduhmyhl1ynrmwNNZs9Mm8WHld6Flfg6qYMlUcZf1jIYNyQxToRpBcNduwiEs79Sbu+OFc8zTjHt6/1nMc3yQIc/6N/t65AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"authToken\"\n        title=\"authToken\"\n        data-src=\"/static/1ddeb2f517b5e6e27fd19c1e33705230/a6d36/authToken.png\"\n        data-srcset=\"/static/1ddeb2f517b5e6e27fd19c1e33705230/222b7/authToken.png 163w,\n/static/1ddeb2f517b5e6e27fd19c1e33705230/ff46a/authToken.png 325w,\n/static/1ddeb2f517b5e6e27fd19c1e33705230/a6d36/authToken.png 650w,\n/static/1ddeb2f517b5e6e27fd19c1e33705230/e548f/authToken.png 975w,\n/static/1ddeb2f517b5e6e27fd19c1e33705230/3c492/authToken.png 1300w,\n/static/1ddeb2f517b5e6e27fd19c1e33705230/db1b2/authToken.png 2900w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>E agora com o <strong>JWT</strong> no <strong>Header</strong> de <strong>Authorization</strong> fazemos o <strong>GET</strong> para a url protegida.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAAA40lEQVQoz3WRa24DMQiEff2cqX96jNwh2Xof+AG2mcJuI22jDdInJIOHMQ5LjHg+HpimCcuyYNu2A6I9k+UrvJ4T4Tkn3L4Lvu4EpohAcQKtM1LJqFxRSjGh1ZoTklFrBTNfIsJWZ8zEKBuhZ0KYzVXyqau5M5gF3RpHb1BVjDHQe/8o6ox20K03iAhUKpQLtMku4oVzuGjOeXf/ymf8LFv2wcEv6B+vcNF33uNf3W/r8MkI0T7lx/DsOxPb5dF0LbwzFK01iL3IaaOhlWSfsiGw2fW9+bMc9edeODo7+xTV9vkLXxMjxA1IunMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"statusOK\"\n        title=\"statusOK\"\n        data-src=\"/static/0d739b7ddbfe72c11a824dc3cc6fd08d/a6d36/statusOK.png\"\n        data-srcset=\"/static/0d739b7ddbfe72c11a824dc3cc6fd08d/222b7/statusOK.png 163w,\n/static/0d739b7ddbfe72c11a824dc3cc6fd08d/ff46a/statusOK.png 325w,\n/static/0d739b7ddbfe72c11a824dc3cc6fd08d/a6d36/statusOK.png 650w,\n/static/0d739b7ddbfe72c11a824dc3cc6fd08d/e548f/statusOK.png 975w,\n/static/0d739b7ddbfe72c11a824dc3cc6fd08d/3c492/statusOK.png 1300w,\n/static/0d739b7ddbfe72c11a824dc3cc6fd08d/01dfe/statusOK.png 2910w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"Codigo-fonte\" style=\"position:relative;\">Código fonte<a href=\"#Codigo-fonte\" aria-label=\"Codigo fonte permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Segue o código completo no <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/security/register\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a>.</p>","fields":{"slug":"/spring-security-jwt/"},"frontmatter":{"date":"14 de dezembro de 2020","description":"Adicionando segurança em uma aplicação com autenticação JWT","title":"Spring Security e JWT","tags":["Java","Spring Boot","Security","JWT"],"author":"Guilherme Alves","image":{"id":"0fee2fb3-6645-5db0-9c72-b87771655ac2","publicURL":"/static/2fd8aacd30a947affcccbdfae3916b4e/spring-security-jwt.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACTUlEQVQoz22Sa0iTURjHT1/6IEEf6kOQBAWF1pdAQowgKApTCSK7YRRpJgSFFggRRHchhMoLoo2kNG1qeCmW81LT3JxTbEtsU0xdKTOdmqlZtne/3p13XooeDpz3Ped/fs//nOcRBMPvV/BMuekabmV85itL6378LMXU9DRjo6Msj4BmYRaBj9fdxVypOkJSURTHdFtJKdnNtZcnsQ3ULx6qH+jncWcH9hYzti47lmojH/IrUZRlUHVI4PVXpziQs47TT3aQVh5LQuF29mWtQddyQ1PPTXPZ0oiwv6OkpRnvhJfGkBgc6+Nx/xjWgErgJkGHz2yZnC/dw4v3eQx4P6Iz31T/92J0PpfilGorsYVvWNFsItJhpunqffpELJXH9dScdeDp9yxCJVDfkcXFsmjqnXq8Mx6ZILU8hoaeCilMqFbdlTkQ2Q2IsDBWCsGd0AysEV6a4tpwu9xSpywA79ae42DeBpKLd8m3C1w9LjeUIus9KWx9aKZqp52cqE7WihCEClyVlElIfjfRFXV8HhnRgAtFKW1/QHzBFs48jZRFSVTno4/CsfYbpbAmuRXDiT6sq9NoCk9QExYg2s1EPHvLRp0F+6d/HE7MjnJBv1/CAi4PF2zmtiFJFfhk5b7xE1N6BoMiio7sUr5MehEmA9vaGhnvdS2rsgpU/D65MDju4lJFHIfyN3HLkMj3uQktq0/b7y0yYk3PxdxtZ8jpIqeullSbBd/8/F+9KDSr2qHJ2TFMvZXM+34F3yTYZMpSa3uGhnH29MBv338b+w/n3oXFeFn+RAAAAABJRU5ErkJggg==","aspectRatio":1.9631901840490797,"src":"/static/2fd8aacd30a947affcccbdfae3916b4e/37fcb/spring-security-jwt.png","srcSet":"/static/2fd8aacd30a947affcccbdfae3916b4e/c67b7/spring-security-jwt.png 320w,\n/static/2fd8aacd30a947affcccbdfae3916b4e/37fcb/spring-security-jwt.png 591w","sizes":"(max-width: 591px) 100vw, 591px"}}}},"timeToRead":14}},"pageContext":{"slug":"/spring-security-jwt/","previous":{"fields":{"slug":"/js-design-patterns/"},"frontmatter":{"title":"Padrões de projeto com JavaScript","date":"01 out, 2020"}},"next":{"fields":{"slug":"/kafka-producer-avro/"},"frontmatter":{"title":"Produzindo mensagens com Kafka e Schema Registry","date":"01 jan, 2021"}}}},"staticQueryHashes":["63159454"]}