add claims & user in JWT

This commit is contained in:
Jari 2025-03-10 23:45:18 +01:00
parent 85dcbad805
commit eaed2a1e04
39 changed files with 205 additions and 107 deletions

View File

@ -1,8 +0,0 @@
package org.js.lorca_core.business.mappers
import org.js.lorca_core.business.models.Client
import org.js.lorca_core.db.entities.ClientEntity
import org.mapstruct.Mapper
@Mapper(componentModel = "spring")
interface ClientMapper : GenericMapper<Client, ClientEntity>

View File

@ -1,6 +1,6 @@
package org.js.lorca_core.web.dtos package org.js.lorca_core.common.dtos
import org.js.lorca_core.web.dtos.validators.NameValidator import org.js.lorca_core.common.dtos.validators.NameValidator
data class ClientDto( data class ClientDto(
@field:NameValidator.Validate @field:NameValidator.Validate

View File

@ -0,0 +1,11 @@
package org.js.lorca_core.common.dtos
import org.js.lorca_core.common.dtos.validators.B64Validator
import org.js.lorca_core.common.dtos.validators.UsernameValidator
data class UserAuthDto(
@field:UsernameValidator.Validate
val username: String,
@field:B64Validator.Validate
val password: String
)

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.web.dtos.validators package org.js.lorca_core.common.dtos.validators
import jakarta.validation.Constraint import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator import jakarta.validation.ConstraintValidator

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.web.dtos.validators package org.js.lorca_core.common.dtos.validators
import jakarta.validation.Constraint import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator import jakarta.validation.ConstraintValidator

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.web.dtos.validators package org.js.lorca_core.common.dtos.validators
import jakarta.validation.Constraint import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator import jakarta.validation.ConstraintValidator

View File

@ -1,6 +1,7 @@
package org.js.lorca_core.common.enums package org.js.lorca_core.common.enums
enum class EBusinessException(val msg: String) { enum class EBusinessException(val msg: String) {
USER_ALREADY_EXISTS("Username: '%s' already exists"),
USER_NOT_FOUND("Username: '%s' not found"), USER_NOT_FOUND("Username: '%s' not found"),
ENTITY_WITH_ID_NOT_FOUND("%s with id %s not found"), ENTITY_WITH_ID_NOT_FOUND("%s with id %s not found"),
INVALID_REQUEST("Invalid request for %s with reason: %s") INVALID_REQUEST("Invalid request for %s with reason: %s")

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.common.mappers
import org.js.lorca_core.common.models.Client
import org.js.lorca_core.db.entities.ClientEntity
import org.mapstruct.Mapper
@Mapper(componentModel = "spring")
interface ClientMapper : GenericMapper<Client, ClientEntity>

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.business.mappers package org.js.lorca_core.common.mappers
interface GenericMapper<M, E> { interface GenericMapper<M, E> {

View File

@ -1,6 +1,6 @@
package org.js.lorca_core.business.mappers package org.js.lorca_core.common.mappers
import org.js.lorca_core.business.models.UserAuthClaim import org.js.lorca_core.common.models.UserAuthClaim
import org.js.lorca_core.db.entities.UserAuthClaimEntity import org.js.lorca_core.db.entities.UserAuthClaimEntity
import org.mapstruct.Mapper import org.mapstruct.Mapper

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.common.mappers
import org.js.lorca_core.common.models.WorkerCategory
import org.js.lorca_core.db.entities.WorkerCategoryEntity
import org.mapstruct.Mapper
@Mapper(componentModel = "spring")
interface WorkCategoryMapper : GenericMapper<WorkerCategory, WorkerCategoryEntity>

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.common.mappers
import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.db.entities.WorkerEntity
import org.mapstruct.Mapper
@Mapper(componentModel = "spring")
interface WorkerMapper : GenericMapper<Worker, WorkerEntity>

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.business.models package org.js.lorca_core.common.models
data class Client( data class Client(
var id: Long?, var id: Long?,

View File

@ -1,4 +1,4 @@
package org.js.lorca_core.business.models package org.js.lorca_core.common.models
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.enums.EUserRoles

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.common.models
data class Worker(
var id: Long,
var name: String,
var surname: String,
val category: WorkerCategory
)

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.common.models
import org.js.lorca_core.common.enums.EWorkerCategory
data class WorkerCategory(
var id: Long,
var name: EWorkerCategory
)

View File

@ -0,0 +1,5 @@
package org.js.lorca_core.common.responses
data class LoginResponse(
val token: String
)

View File

@ -1,6 +1,6 @@
package org.js.lorca_core.config.auth package org.js.lorca_core.config.auth
import org.js.lorca_core.business.repositories.UserAuthRepository import org.js.lorca_core.repositories.UserAuthRepository
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.authentication.AuthenticationManager

View File

@ -6,4 +6,5 @@ import java.util.*
interface UserAuthJpa : JpaRepository<UserAuthEntity, Long> { interface UserAuthJpa : JpaRepository<UserAuthEntity, Long> {
fun findByUsr(username: String): Optional<UserAuthEntity> fun findByUsr(username: String): Optional<UserAuthEntity>
fun existsByUsr(username: String): Boolean
} }

View File

@ -1,11 +1,9 @@
package org.js.lorca_core.db package org.js.lorca_core.db
import org.js.lorca_core.common.enums.EWorkerCategory
import org.js.lorca_core.db.entities.WorkerEntity import org.js.lorca_core.db.entities.WorkerEntity
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.repository.query.Param import java.util.*
interface WorkerJpa : JpaRepository<WorkerEntity, Long> { interface WorkerJpa : JpaRepository<WorkerEntity, Long> {
fun findByAuthUserUsr(username: String): Optional<WorkerEntity>
fun findAllByCategoryName(@Param("category") category: EWorkerCategory): MutableList<WorkerEntity>
} }

View File

@ -5,12 +5,12 @@ import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.core.userdetails.UserDetails
@Entity(name = "user_auth") @Entity(name = "user_auth")
class UserAuthEntity : UserDetails { class UserAuthEntity(usr: String, pwd: String) : UserDetails {
@Id @Id
@GeneratedValue @GeneratedValue
var id: Long? = null var id: Long? = null
var usr: String? = null var usr: String? = usr
var pwd: String? = null var pwd: String? = pwd
@ManyToMany(cascade = [CascadeType.DETACH]) @ManyToMany(cascade = [CascadeType.DETACH])
var claims: MutableList<UserAuthClaimEntity> = mutableListOf() var claims: MutableList<UserAuthClaimEntity> = mutableListOf()

View File

@ -9,5 +9,7 @@ data class WorkerEntity(
var name: String, var name: String,
var surname: String, var surname: String,
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
val category: WorkerCategoryEntity val category: WorkerCategoryEntity,
@OneToOne(fetch = FetchType.LAZY)
val authUser: UserAuthEntity
) )

View File

@ -1,6 +1,6 @@
package org.js.lorca_core.business.repositories package org.js.lorca_core.repositories
import org.js.lorca_core.business.models.Client import org.js.lorca_core.common.models.Client
interface ClientRepository { interface ClientRepository {
fun createClient(client: Client): Client fun createClient(client: Client): Client

View File

@ -1,10 +1,11 @@
package org.js.lorca_core.business.repositories package org.js.lorca_core.repositories
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.enums.EUserRoles
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.db.entities.UserAuthEntity
interface UserAuthRepository { interface UserAuthRepository {
fun existsByUsername(username: String): Boolean
fun getByUsername(username: String): UserAuthEntity fun getByUsername(username: String): UserAuthEntity
fun save(userAuth: UserAuthEntity): UserAuthEntity fun save(userAuth: UserAuthEntity): UserAuthEntity
fun getClaimsForuser(user: UserAuthEntity): List<EUserRoles> fun getClaimsForUser(user: UserAuthEntity): List<EUserRoles>
} }

View File

@ -0,0 +1,7 @@
package org.js.lorca_core.repositories
import org.js.lorca_core.common.models.Worker
interface WorkerRepository {
fun getByUsername(username: String): Worker?
}

View File

@ -1,11 +1,11 @@
package org.js.lorca_core.business.repositories.impl package org.js.lorca_core.repositories.impl
import org.js.lorca_core.business.mappers.ClientMapper
import org.js.lorca_core.business.models.Client
import org.js.lorca_core.business.repositories.ClientRepository
import org.js.lorca_core.common.enums.EBusinessException import org.js.lorca_core.common.enums.EBusinessException
import org.js.lorca_core.common.exceptions.LorcaException import org.js.lorca_core.common.exceptions.LorcaException
import org.js.lorca_core.common.mappers.ClientMapper
import org.js.lorca_core.common.models.Client
import org.js.lorca_core.db.ClientJpa import org.js.lorca_core.db.ClientJpa
import org.js.lorca_core.repositories.ClientRepository
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@Component @Component

View File

@ -1,12 +1,12 @@
package org.js.lorca_core.business.repositories.impl package org.js.lorca_core.repositories.impl
import org.js.lorca_core.business.mappers.UserAuthClaimMapper
import org.js.lorca_core.business.repositories.UserAuthRepository
import org.js.lorca_core.common.enums.EBusinessException import org.js.lorca_core.common.enums.EBusinessException
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.enums.EUserRoles
import org.js.lorca_core.common.exceptions.LorcaException import org.js.lorca_core.common.exceptions.LorcaException
import org.js.lorca_core.common.mappers.UserAuthClaimMapper
import org.js.lorca_core.db.UserAuthJpa import org.js.lorca_core.db.UserAuthJpa
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.UserAuthRepository
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@Component @Component
@ -23,8 +23,12 @@ class UserAuthRepositoryImpl(
return jpa.save(userAuth) return jpa.save(userAuth)
} }
override fun getClaimsForuser(user: UserAuthEntity): List<EUserRoles> { override fun getClaimsForUser(user: UserAuthEntity): List<EUserRoles> {
return claimMapper.toModels(user.claims).map { it.name }.toList() return claimMapper.toModels(user.claims).map { it.name }.toList()
} }
override fun existsByUsername(username: String): Boolean {
return jpa.existsByUsr(username)
}
} }

View File

@ -0,0 +1,20 @@
package org.js.lorca_core.repositories.impl
import org.js.lorca_core.common.mappers.WorkerMapper
import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.db.WorkerJpa
import org.js.lorca_core.repositories.WorkerRepository
import org.springframework.stereotype.Component
import kotlin.jvm.optionals.getOrNull
@Component
class WorkerRepositoryImpl(
val jpa: WorkerJpa,
val mapper: WorkerMapper
) : WorkerRepository {
override fun getByUsername(username: String): Worker? {
val user = jpa.findByAuthUserUsr(username).getOrNull()
return if (user != null) mapper.toModel(user) else null
}
}

View File

@ -1,13 +1,10 @@
package org.js.lorca_core.services package org.js.lorca_core.services
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.dtos.UserAuthDto
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.common.responses.LoginResponse
import org.js.lorca_core.web.dtos.UserAuthDto
interface AuthenticationService { interface AuthenticationService {
fun register(input: UserAuthDto): Boolean fun register(dto: UserAuthDto): Boolean
fun login(input: UserAuthDto): UserAuthEntity fun login(dto: UserAuthDto): LoginResponse
fun getClaimsForUser(user: UserAuthEntity): List<EUserRoles>
} }

View File

@ -1,7 +1,7 @@
package org.js.lorca_core.services package org.js.lorca_core.services
import org.js.lorca_core.business.models.Client import org.js.lorca_core.common.dtos.ClientDto
import org.js.lorca_core.web.dtos.ClientDto import org.js.lorca_core.common.models.Client
interface ClientService { interface ClientService {
fun getAllClients(name: String?, surname: String?): MutableList<Client> fun getAllClients(name: String?, surname: String?): MutableList<Client>

View File

@ -1,10 +1,13 @@
package org.js.lorca_core.services.impl package org.js.lorca_core.services.impl
import org.js.lorca_core.business.repositories.UserAuthRepository import org.js.lorca_core.common.dtos.UserAuthDto
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.enums.EBusinessException
import org.js.lorca_core.common.exceptions.LorcaException
import org.js.lorca_core.common.responses.LoginResponse
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.UserAuthRepository
import org.js.lorca_core.services.AuthenticationService import org.js.lorca_core.services.AuthenticationService
import org.js.lorca_core.web.dtos.UserAuthDto import org.js.lorca_core.services.JwtService
import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.authentication.AuthenticationManager
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.crypto.password.PasswordEncoder
@ -15,30 +18,31 @@ import org.springframework.stereotype.Service
class AuthenticationServiceImpl( class AuthenticationServiceImpl(
private val userAuthRepository: UserAuthRepository, private val userAuthRepository: UserAuthRepository,
private val authenticationManager: AuthenticationManager, private val authenticationManager: AuthenticationManager,
private val passwordEncoder: PasswordEncoder private val passwordEncoder: PasswordEncoder,
private val jwtService: JwtService
) : AuthenticationService { ) : AuthenticationService {
override fun register(input: UserAuthDto): Boolean { override fun register(dto: UserAuthDto): Boolean {
val user = UserAuthEntity() if (userAuthRepository.existsByUsername(dto.username)) {
user.username = input.username throw LorcaException(EBusinessException.USER_ALREADY_EXISTS, dto.username)
user.password = passwordEncoder.encode(input.password) }
userAuthRepository.save(user)
userAuthRepository.save(UserAuthEntity(dto.username, passwordEncoder.encode(dto.password)))
return true return true
} }
override fun login(input: UserAuthDto): UserAuthEntity { override fun login(dto: UserAuthDto): LoginResponse {
authenticationManager.authenticate( authenticationManager.authenticate(
UsernamePasswordAuthenticationToken( UsernamePasswordAuthenticationToken(
input.username, dto.username,
input.password dto.password
) )
) )
return userAuthRepository.getByUsername(input.username) val user = userAuthRepository.getByUsername(dto.username)
} return LoginResponse(
jwtService.generateToken(user)
override fun getClaimsForUser(user: UserAuthEntity): List<EUserRoles> { )
return userAuthRepository.getClaimsForuser(user)
} }
} }

View File

@ -1,9 +1,9 @@
package org.js.lorca_core.services.impl package org.js.lorca_core.services.impl
import org.js.lorca_core.business.models.Client import org.js.lorca_core.common.dtos.ClientDto
import org.js.lorca_core.business.repositories.ClientRepository import org.js.lorca_core.common.models.Client
import org.js.lorca_core.repositories.ClientRepository
import org.js.lorca_core.services.ClientService import org.js.lorca_core.services.ClientService
import org.js.lorca_core.web.dtos.ClientDto
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@Service @Service

View File

@ -4,6 +4,10 @@ import io.jsonwebtoken.Claims
import io.jsonwebtoken.Jwts import io.jsonwebtoken.Jwts
import io.jsonwebtoken.io.Decoders import io.jsonwebtoken.io.Decoders
import io.jsonwebtoken.security.Keys import io.jsonwebtoken.security.Keys
import org.js.lorca_core.common.enums.EUserRoles
import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.UserAuthRepository
import org.js.lorca_core.repositories.WorkerRepository
import org.js.lorca_core.services.JwtService import org.js.lorca_core.services.JwtService
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.core.userdetails.UserDetails
@ -13,7 +17,10 @@ import java.util.function.Function
import javax.crypto.SecretKey import javax.crypto.SecretKey
@Service @Service
class JwtServiceImpl : JwtService { class JwtServiceImpl(
private val userAuthRepository: UserAuthRepository,
private val workerRepository: WorkerRepository
) : JwtService {
@Value("\${security.jwt.secret-key}") @Value("\${security.jwt.secret-key}")
private lateinit var secretKey: String private lateinit var secretKey: String
@ -31,7 +38,29 @@ class JwtServiceImpl : JwtService {
} }
override fun generateToken(userDetails: UserDetails): String { override fun generateToken(userDetails: UserDetails): String {
return generateToken(emptyMap(), userDetails) val extraClaims: Map<String, Any> = mapOf()
getClaimsForUser(userAuthRepository.getByUsername(userDetails.username)).let { claims ->
if (claims.isNotEmpty()) {
extraClaims.plus(
Pair(
"roles",
claims
)
)
}
}
workerRepository.getByUsername(userDetails.username)?.let {
extraClaims.plus(
Pair(
"user",
it
)
)
}
return generateToken(
extraClaims, userDetails
)
} }
override fun generateToken(extraClaims: Map<String, Any>, userDetails: UserDetails): String { override fun generateToken(extraClaims: Map<String, Any>, userDetails: UserDetails): String {
@ -81,4 +110,8 @@ class JwtServiceImpl : JwtService {
val keyBytes = Decoders.BASE64.decode(secretKey) val keyBytes = Decoders.BASE64.decode(secretKey)
return Keys.hmacShaKeyFor(keyBytes) return Keys.hmacShaKeyFor(keyBytes)
} }
private fun getClaimsForUser(user: UserAuthEntity): List<EUserRoles> {
return userAuthRepository.getClaimsForUser(user)
}
} }

View File

@ -28,6 +28,7 @@ class BaseAdvice {
private fun deductStatus(ex: EBusinessException): HttpStatus { private fun deductStatus(ex: EBusinessException): HttpStatus {
return when (ex) { return when (ex) {
EBusinessException.USER_ALREADY_EXISTS -> HttpStatus.UNPROCESSABLE_ENTITY
EBusinessException.USER_NOT_FOUND -> HttpStatus.NOT_FOUND EBusinessException.USER_NOT_FOUND -> HttpStatus.NOT_FOUND
EBusinessException.ENTITY_WITH_ID_NOT_FOUND -> HttpStatus.NOT_FOUND EBusinessException.ENTITY_WITH_ID_NOT_FOUND -> HttpStatus.NOT_FOUND
EBusinessException.INVALID_REQUEST -> HttpStatus.BAD_REQUEST EBusinessException.INVALID_REQUEST -> HttpStatus.BAD_REQUEST

View File

@ -2,11 +2,10 @@ package org.js.lorca_core.web.controllers
import jakarta.validation.Valid import jakarta.validation.Valid
import lombok.AllArgsConstructor import lombok.AllArgsConstructor
import org.js.lorca_core.common.dtos.UserAuthDto
import org.js.lorca_core.common.responses.LoginResponse
import org.js.lorca_core.services.AuthenticationService import org.js.lorca_core.services.AuthenticationService
import org.js.lorca_core.services.JwtService
import org.js.lorca_core.web.advices.WebResponse import org.js.lorca_core.web.advices.WebResponse
import org.js.lorca_core.web.dtos.UserAuthDto
import org.js.lorca_core.web.responses.LoginResponse
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
@ -17,8 +16,7 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/auth") @RequestMapping("/auth")
@AllArgsConstructor @AllArgsConstructor
class AuthController( class AuthController(
val authenticationService: AuthenticationService, val authenticationService: AuthenticationService
val jwtService: JwtService
) { ) {
@PostMapping("/register") @PostMapping("/register")
@ -29,13 +27,8 @@ class AuthController(
@PostMapping("/login") @PostMapping("/login")
fun authenticate(@Valid @RequestBody loginUserDto: UserAuthDto): WebResponse<LoginResponse> { fun authenticate(@Valid @RequestBody loginUserDto: UserAuthDto): WebResponse<LoginResponse> {
val user = authenticationService.login(loginUserDto)
return WebResponse.ok( return WebResponse.ok(
LoginResponse( authenticationService.login(loginUserDto)
jwtService.generateToken(user),
jwtService.getExpirationTime(),
authenticationService.getClaimsForUser(user)
)
) )
} }

View File

@ -2,10 +2,10 @@ package org.js.lorca_core.web.controllers
import jakarta.validation.Valid import jakarta.validation.Valid
import lombok.AllArgsConstructor import lombok.AllArgsConstructor
import org.js.lorca_core.business.models.Client import org.js.lorca_core.common.dtos.ClientDto
import org.js.lorca_core.common.models.Client
import org.js.lorca_core.services.ClientService import org.js.lorca_core.services.ClientService
import org.js.lorca_core.web.advices.WebResponse import org.js.lorca_core.web.advices.WebResponse
import org.js.lorca_core.web.dtos.ClientDto
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
@RestController @RestController

View File

@ -1,11 +0,0 @@
package org.js.lorca_core.web.dtos
import org.js.lorca_core.web.dtos.validators.B64Validator
import org.js.lorca_core.web.dtos.validators.UsernameValidator
data class UserAuthDto(
@field:UsernameValidator.Validate
val username: String,
@field:B64Validator.Validate
val password: String
)

View File

@ -1,9 +0,0 @@
package org.js.lorca_core.web.responses
import org.js.lorca_core.common.enums.EUserRoles
data class LoginResponse(
val token: String,
val expiresIn: Long,
val claims: List<EUserRoles>
)

View File

@ -1,5 +1,9 @@
server.servlet.context-path=/api server.servlet.context-path=/api
spring.application.name=lorca-gestionale-be spring.application.name=lorca-gestionale-be
#
#
# DATABASE
#
spring.datasource.url=jdbc:postgresql://0.0.0.0:5432/lorca_db spring.datasource.url=jdbc:postgresql://0.0.0.0:5432/lorca_db
spring.datasource.username=lorca_usr spring.datasource.username=lorca_usr
spring.datasource.password=lorca_pwd spring.datasource.password=lorca_pwd
@ -7,8 +11,12 @@ spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.generate-ddl=true spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update
# HOW TO GENERATE THIS KEY AT : #
#
# HOW TO GENERATE THIS KEY AT : https://www.devglan.com/online-tools/hmac-sha256-online?ref=blog.tericcabrel.com
# PLAIN TEXT: Boh che cazzo ne so bel testo peró complimenti # PLAIN TEXT: Boh che cazzo ne so bel testo peró complimenti
# SECRET KEY: Ma che minchia ne so quale puo essere una bella chiave segreta dio negraccio # SECRET KEY: Ma che minchia ne so quale puo essere una bella chiave segreta dio negraccio
security.jwt.secret-key=93d5326c5ae622c9332f291c6a9868d237e6b41fc47c5f2581448d4d90e90a1a security.jwt.secret-key=93d5326c5ae622c9332f291c6a9868d237e6b41fc47c5f2581448d4d90e90a1a
security.jwt.expiration-time=3600000 security.jwt.expiration-time=3600000
#
#