Loading repository data…
Loading repository data…
fabiodelgadopereira / repository
Este repositório contém uma implementação que orientará você na criação de um aplicativo de básico contendo autenticação, documentação e integração com banco de dados.
Olá! Seja bem vindo ;)
Este repositório contém uma implementação que orientará você na criação de um aplicativo de básico contendo autenticação, documentação e integração com banco de dados.
JDK 1.8 + Maven 3.0 +
code .F5 para executar a aplicação.A aplicação deverá estar disponivel em seu navegador no endereço: http://localhost:8080/swagger-ui/index.html
O Swagger é uma aplicação open source que auxilia os desenvolvedores a definir, criar, documentar e consumir APIs REST; É composto de um arquivo de configuração, que pode ser definido em YAML ou JSON; Fornece ferramentas para: auxiliar na definição do arquivo de configuração (Swagger Editor), interagir com API através das definições do arquivo de configuração (Swagger UI) e gerar templates de código a partir do arquivo de configuração (Swagger Codegen).
fonte: https://swagger.io/resources/webinars/getting-started-with-swagger/
A maneira mais fácil de instalar é usar o Maven:
pom.xml
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
Exemplo de implementação em
config/ApplicationConfig
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.service.ApiInfo
import springfox.documentation.service.Contact
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2
@Configuration
@EnableSwagger2
class ApplicationConfig {
@Bean
fun api(): Docket {
return Docket(DocumentationType.SWAGGER_2)
.apiInfo(getApiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build()
}
private fun getApiInfo(): ApiInfo {
return ApiInfoBuilder()
.title("Kotlin Api Sample")
.build()
}
}
O JWT (JSON Web Token) nada mais é que um padrão (RFC-7519) de mercado que define como transmitir e armazenar objetos JSON de forma simples, compacta e segura entre diferentes aplicações, muito utilizado para validar serviços em Web Services pois os dados contidos no token gerado pode ser validado a qualquer momento uma vez que ele é assinado digitalmente.
JSON Web Tokens (JWT) é um padrão stateless porque o servidor autorizador não precisa manter nenhum estado; o próprio token é sulficiente para verificar a autorização de um portador de token.
Os JWTs são assinados usando um algoritmo de assinatura digital (por exemplo, RSA) que não pode ser forjado. Por isso, qualquer pessoa que confie no certificado do assinante pode confiar com segurança que o JWT é autêntico. Não há necessidade de um servidor consultar o servidor emissor de token para confirmar sua autenticidade.
fonte: https://jwt.io/introduction/
Exemplo de chamada curl:
curl -X POST "http://localhost:8080/login" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"username\": \"admin.admin\", \"password\": \"test1234\"}"
A maneira mais fácil de instalar é usar o Maven:
pom.xml
<properties>
<java.version>11</java.version>
<kotlin.version>1.4.21</kotlin.version>
<jjwt.version>0.11.2</jjwt.version>
</properties>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<compilerPlugins>
<plugin>spring</plugin>
<plugin>jpa</plugin>
</compilerPlugins>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
Como foram muitas alterações, segue a lista de arquivos que envolvem a utilização de SMTP nesse exemplo:
src/main/kotlin/com/example/demo/config/AppConfiguration.kt
src/main/kotlin/com/example/demo/config/ApplicationConfig.kt
src/main/kotlin/com/example/demo/config/SecurityProperties.kt
src/main/kotlin/com/example/demo/config/WebConfig.kt
src/main/kotlin/com/example/demo/db/AppUserDetailsService.kt
src/main/kotlin/com/example/demo/db/UserRepository.kt
src/main/kotlin/com/example/demo/model/Role.kt
src/main/kotlin/com/example/demo/model/User.kt
src/main/kotlin/com/example/demo/security/JWTAuthenticationFilter.kt
src/main/kotlin/com/example/demo/security/JWTAuthorizationFilter.kt
src/main/resources/application.properties
O mapeamento objeto-relacional foi criado para abstrair as diferenças entre o modelo relacional e o paradigma orientado a objetos. Assim, deixa de ser necessário criarmos soluções com o intuito de converter dados em objetos e vice-versa. Em Java, após a especificação JPA, isso passou a ser feito pelos frameworks que a implementam, como o Hibernate, EclipseLink e OpenJPA. A nós, desenvolvedores, basta fazer uso das anotações disponibilizadas pela JPA para viabilizar o mapeamento, evitando dessa forma criar uma forte dependência com alguma implementação. (fonte devmedia)
Configurando o ambiente TCP para SQL Server
Firewall
telnet localhost 1433sc query mssqlservernetstat -ano | find "1433"A maneira mais fácil de instalar é usar o Maven:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.31.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.31.Final</version>
</dependency>
Exemplo de implementação para testes
application.properties
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=database
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
security.ignored=none
model\modelCliente
import javax.persistence.*
@Entity
@Table(name="Clientes", catalog="CadastroDB", schema="dbo")
data class Cliente(
@get:Size(min=3, max=15)
var nome: String,
@get:Size(min=3, max=50)
var cidade: String,
@field:Email @get:Size(min=3, max=300)
var email: String,
@get:Size(min=3, max=15)
var sexo: String,
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @JsonProperty(access = JsonProperty.Access.READ_ONLY)
val id: Long = 0,
)
controller\ClienteController
import com.example.demo.db.ClienteRepository
import com.example.demo.model.Cliente
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/Cliente")
class ClienteController(val repository: ClienteRepository) {
@GetMapping
fun findAll() = repository.findAll()
@PostMapping
fun addCliente(@RequestBody Cliente: Cliente)
= repository.save(Cliente)
@PutMapping("/{id}")
fun updateCliente(@PathVariable id: Long, @RequestBody cliente: Cliente) {
var clientUpdate : Cliente = repository.findById(id).get().copy(
nome = cliente.nome,
cidade = cliente.cidade,
email = cliente.email,
sexo = cliente.sexo
)
repository.save(clientUpdate)
}
@DeleteMapping("/{id}")
fun removeCliente(@PathVariable id: Long)
= repository.deleteById(id)
@GetMapping("/{id}")
fun getById(@PathVariable id: Long)
= repository.findById(id)
}
db\ClienteRepository
package com.example.demo.db
import com.example.demo.model.Cliente
import org.springframework.data.repository.CrudRepository
interface ClienteRepository : CrudRepository<Cliente, Long> {
fun findById(name: String): List<Cliente>
}
O SMTP ou Simple Mail Transfer Protocol, é uma convenção padrão dedicada ao envio de e-mail. A princípio o protocolo SMTP utilizava por padrão a porta 25 ou 465 (conexão criptografada) para conexão, porém a partir de 2013 os provedores de internet e as operadoras do Brasil passaram a bloquear a porta 25, e começaram a usar a porta 587 para diminuir a quantidade de SPAM. O SMTP é