0
respostas

Usuário ver apenas seu próprio recurso.

Opa pessoal, beleza? Estou implementando a autenticação o Spring e criei um endpoint onde o usuário, acessa apenas os suas compras.

Eu consegui fazer, eu queria mais um feedback mesmo sobre a forma que eu fiz, se ela esta adequada ou não, por falta de ter pessoas por perto para me direcionar, eu gostaria de um retorno por aqui se possível.

Bom vamos lá:

Controller:

    @GetMapping("customer/{id}")
    @UserCanOnlyAccessTheirOwnResource
    fun findPurchaseByCustomer(
        @PathVariable id: Int,
        @PageableDefault(page = 0, size = 48) pageable: Pageable
    ): PageResponse<PurchaseResponse> {
        return purchaseService.findAllByCustomerId(id, pageable).map {
            it.toPurchaseModel()
        }.toPageResponse()
    }

@UserCanOnlyAccessTheirOwnResource

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@PreAuthorize("hasRole('ROLE_ADMIN')|| #id == authentication.principal.id")
annotation class UserCanOnlyAccessTheirOwnResource

Bom, repara que aqui, na url eu vou passar o id do usuário e com a anotação UserCanOnlyAccessTheirOwnResource, eu verifico se ele tem permissão de admin, ou se essa compra é dele, ou seja, do usuário logado na aplicação por exemplo.

Service:

fun findAllByCustomerId(id: Int, pageable: Pageable): Page<PurchaseModel> {
        return purchaseRepository.findByCustomerId(
            id = id,
            pageable = pageable
        )
    }

Repository:

 @Query("select p from purchase p inner join p.customer c where c.id = :id order by p.id DESC")
    fun findByCustomerId(id: Int, pageable: Pageable): Page<PurchaseModel>

Isso tudo, funciona. Mas pensando já na aplicação mobile, onde eu vou consumir isso, estaria correto passar o id do usuário ali na url?

Essa é a grande questão que me preocupa, se esta correto dessa forma ou se tem uma forma melhor. o meu token gerado, eu identifico ele pelo id do usuario.

Bom, é isso pessoal, qualquer feedback é bem vindo.