Pular para o conteúdo
Skillpedia
Segurança280 mil · #107

quarkus-security

Ajuda seu agente a implementar segurança em aplicações Quarkus. Ele configura autenticação, autorização e validação de dados para proteger o sistema contra acessos não autorizados.

O que ela faz

Este guia ensina como proteger aplicações feitas com Quarkus. Ele cobre como verificar quem está acessando (autenticação) e o que eles podem fazer (autorização), além de como garantir que as informações enviadas pelos usuários estejam corretas (validação).

Quando usar

  • ✓Ao adicionar login e senha para usuários.
  • ✓Ao definir quais partes do sistema cada tipo de usuário pode ver ou usar.
  • ✓Ao verificar se os dados que o usuário digita estão no formato certo.

Exemplo do que pedir para a IA

“Como configuro o login usando JWT?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/quarkus-security/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/quarkus-security/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O guia mostra exemplos de código para configurar autenticação (como JWT ou OIDC) e autorização (definindo papéis como 'ADMIN'). Ele também explica como validar dados de entrada usando regras pré-definidas ou personalizadas.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill quarkus-security

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/quarkus-security/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Revisão de Segurança do Quarkus

Melhores práticas para proteger aplicações Quarkus com autenticação, autorização e validação de entrada.

Quando Ativar

  • Adicionando autenticação (JWT, OIDC, Basic Auth)
  • Implementando autorização com @RolesAllowed ou SecurityIdentity
  • Validando entrada do usuário (Bean Validation, validadores customizados)
  • Configurando CORS ou cabeçalhos de segurança
  • Gerenciando segredos (Vault, variáveis de ambiente, fontes de configuração)
  • Adicionando limitação de taxa (rate limiting) ou proteção contra força bruta
  • Verificando dependências em busca de CVEs
  • Trabalhando com MicroProfile JWT ou SmallRye JWT

Autenticação

Autenticação JWT

// Resource protected with JWT
@Path("/api/protected")
@Authenticated
public class ProtectedResource {

  @Inject
  JsonWebToken jwt;

  @Inject
  SecurityIdentity securityIdentity;

  @GET
  public Response getData() {
    String username = jwt.getName();
    Set<String> roles = jwt.getGroups();
    return Response.ok(Map.of(
        "username", username,
        "roles", roles,
        "principal", securityIdentity.getPrincipal().getName()
    )).build();
  }
}

Configuração (application.properties):

mp.jwt.verify.publickey.location=publicKey.pem
mp.jwt.verify.issuer=https://auth.example.com

# OIDC
quarkus.oidc.auth-server-url=https://auth.example.com/realms/myrealm
quarkus.oidc.client-id=backend-service
quarkus.oidc.credentials.secret=${OIDC_SECRET}

Filtro de Autenticação Customizado

@Provider
@Priority(Priorities.AUTHENTICATION)
public class CustomAuthFilter implements ContainerRequestFilter {

  @Inject
  SecurityIdentity identity;

  @Override
  public void filter(ContainerRequestContext requestContext) {
    String authHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);

    // Reject immediately if header is absent or malformed
    if (authHeader == null || !authHeader.startsWith("Bearer ")) {
      requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
      return;
    }

    String token = authHeader.substring(7);
    if (!validateToken(token)) {
      requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
    }
  }

  private boolean validateToken(String token) {
    // Token validation logic
    return true;
  }
}

Autorização

Controle de Acesso Baseado em Papéis (Role-Based Access Control)

@Path("/api/admin")
@RolesAllowed("ADMIN")
public class AdminResource {

  @GET
  @Path("/users")
  public List<UserDto> listUsers() {
    return userService.findAll();
  }

  @DELETE
  @Path("/users/{id}")
  @RolesAllowed({"ADMIN", "SUPER_ADMIN"})
  public Response deleteUser(@PathParam("id") Long id) {
    userService.delete(id);
    return Response.noContent().build();
  }
}

@Path("/api/users")
public class UserResource {

  @Inject
  SecurityIdentity securityIdentity;

  @GET
  @Path("/{id}")
  @RolesAllowed("USER")
  public Response getUser(@PathParam("id") Long id) {
    // Check ownership
    if (!securityIdentity.hasRole("ADMIN") &&
        !isOwner(id, securityIdentity.getPrincipal().getName())) {
      return Response.status(Response.Status.FORBIDDEN).build();
    }
    return Response.ok(userService.findById(id)).build();
  }

  private boolean isOwner(Long userId, String username) {
    return userService.isOwner(userId, username);
  }
}

Segurança Programática

@ApplicationScoped
public class SecurityService {

  @Inject
  SecurityIdentity securityIdentity;

  public boolean canAccessResource(Long resourceId) {
    if (securityIdentity.isAnonymous()) {
      return false;
    }

    if (securityIdentity.hasRole("ADMIN")) {
      return true;
    }

    String userId = securityIdentity.getPrincipal().getName();
    return resourceRepository.isOwner(resourceId, userId);
  }
}

Validação de Entrada

Bean Validation

// BAD: No validation
@POST
public Response createUser(UserDto dto) {
  return Response.ok(userService.create(dto)).build();
}

// GOOD: Validated DTO
public record CreateUserDto(
    @NotBlank @Size(max = 100) String name,
    @NotBlank @Email String email,
    @NotNull @Min(18) @Max(150) Integer age,
    @Pattern(regexp = "^\\+?[1-9]\\d{1,14}$") String phone
) {}

@POST
@Path("/users")
public Response createUser(@Valid CreateUserDto dto) {
  User user = userService.create(dto);
  return Response.status(Response.Status.CREATED).entity(user).build();
}

Validadores Customizados

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)

…
Perguntas frequentes

O que é JWT?

JWT (JSON Web Token) é uma forma comum de enviar informações de segurança entre partes, como quem é o usuário e quais são suas permissões.

O que é OIDC?

OIDC (OpenID Connect) é um protocolo que permite que usuários façam login em uma aplicação usando credenciais de outro serviço, como Google ou Facebook.

O que são 'headers' de segurança?

São instruções extras enviadas com as requisições para aumentar a segurança, como bloquear acesso de origens indesejadas (CORS) ou proteger contra ataques comuns.

Detalhes

Descrição original do autor

Quarkus security implementation patterns: JWT and OIDC authentication, @RolesAllowed RBAC and SecurityIdentity checks, Bean Validation and custom validators, parameterized Panache queries, BCrypt password hashing, CORS and security headers, rate limiting, audit logging, Vault or environment-variable secrets, and dependency CVE scanning. Use when adding authentication or authorization, validating i

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#107
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas