Skip to content

Conversation

@OtavioXimarelli
Copy link
Owner

@OtavioXimarelli OtavioXimarelli commented Jun 2, 2025

Resumo por Sourcery

Introduzir autenticação de usuário protegendo requisições HTTP, configurando a codificação de senhas e o gerenciador de autenticação, migrando a estratégia de ID de usuário para UUIDs e fornecendo um endpoint de API de login.

Novas Funcionalidades:

  • Adicionar endpoint de API de login com controller e DTO para autenticação de usuário

Melhorias:

  • Configurar SecurityFilterChain para desabilitar CSRF, usar sessões sem estado e requerer autenticação para todas as requisições
  • Expor beans AuthenticationManager e BCryptPasswordEncoder
  • Alterar a estratégia de geração de ID da entidade User de IDENTITY para UUID
Original summary in English

Summary by Sourcery

Introduce user authentication by securing HTTP requests, setting up password encoding and authentication manager, migrating user ID strategy to UUIDs, and providing a login API endpoint

New Features:

  • Add login API endpoint with controller and DTO for user authentication

Enhancements:

  • Configure SecurityFilterChain to disable CSRF, use stateless sessions, and require authentication for all requests
  • Expose AuthenticationManager and BCryptPasswordEncoder beans
  • Change User entity ID generation strategy from IDENTITY to UUID

@sourcery-ai
Copy link

sourcery-ai bot commented Jun 2, 2025

Guia do Revisor

Este PR impõe autenticação em toda a aplicação, atualizando a cadeia de filtros de segurança, registra os beans de autenticação necessários (AuthenticationManager e BCryptPasswordEncoder), muda a geração de ID da entidade de usuário para a estratégia UUID e adiciona um endpoint de login com seu DTO correspondente.

Diagrama de Sequência para o Processo de Login do Usuário

sequenceDiagram
    actor User
    participant AuthController as AuthenticationController
    participant AuthManager as AuthenticationManager

    User->>AuthController: POST /api/auth/login (AuthenticationDTO)
    AuthController->>AuthManager: authenticate(usernamePasswordToken)
    AuthManager-->>AuthController: Authentication Result (Authenticated User)
    AuthController-->>User: HTTP 200 OK (Authentication Token/Details)
Loading

Diagrama ER: Atualização da Geração de ID da Entidade de Usuário

erDiagram
    User {
        Long id PK "Estratégia alterada para GenerationType.UUID"
        String login "único, nullable=false"
        String password "nullable=false"
    }
Loading

Diagrama de Classes: Novo AuthenticationDTO

classDiagram
      class AuthenticationDTO {
        <<Record>>
        +String login
        +String password
      }
Loading

Diagrama de Classes: Novo AuthenticationController

classDiagram
      class AuthenticationController {
        -AuthenticationManager authenticationManager
        +ResponseEntity login(AuthenticationDTO data)
      }
      AuthenticationController ..> AuthenticationManager : uses
      AuthenticationController ..> AuthenticationDTO : uses
Loading

Diagrama de Classes: Entidade de Usuário Atualizada

classDiagram
      class User {
        <<Entity>>
        -Long id "Anotação: @GeneratedValue(strategy = GenerationType.UUID) adicionada"
        -String login
        -String password
        +getAuthorities() Collection~GrantedAuthority~
        +getPassword() String
        +getUsername() String
        +isAccountNonExpired() boolean
        +isAccountNonLocked() boolean
        +isCredentialsNonExpired() boolean
        +isEnabled() boolean
      }
Loading

Diagrama de Classes: SecurityConfig Atualizado

classDiagram
      class SecurityConfig {
        +SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) "Atualizado: impõe .anyRequest().authenticated()"
        +AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authConfig) "Novo método"
        +PasswordEncoder passwordEncoder() "Novo método (retorna BCryptPasswordEncoder)"
      }
      SecurityConfig ..> HttpSecurity : configures
      SecurityConfig ..> AuthenticationConfiguration : uses
      SecurityConfig ..> AuthenticationManager : creates
      SecurityConfig ..> PasswordEncoder : creates
      SecurityConfig ..> BCryptPasswordEncoder : instantiates
Loading

Alterações no Nível do Arquivo

Mudança Detalhes Arquivos
Configuração de segurança aprimorada para exigir autenticação e expor beans-chave
  • Encadeado authorizeHttpRequests().anyRequest().authenticated() na cadeia de filtros
  • Adicionado um bean AuthenticationManager para autenticação programática
  • Registrado um bean BCryptPasswordEncoder para hashing de senha
src/main/java/com/otavio/aifoodapp/config/SecurityConfig.java
Alterada a geração de ID da entidade de usuário para UUID
  • Estratégia @GeneratedValue atualizada de IDENTITY para UUID
src/main/java/com/otavio/aifoodapp/model/User.java
Adicionado um endpoint REST para login do usuário
  • Criado AuthenticationController com um POST /api/auth/login que autentica as credenciais
src/main/java/com/otavio/aifoodapp/controller/AuthenticationController.java
Introduzido DTO para solicitações de autenticação
  • Definido registro AuthenticationDTO com campos de login e senha
src/main/java/com/otavio/aifoodapp/dto/AuthenticationDTO.java

Dicas e comandos

Interagindo com o Sourcery

  • Acionar uma nova revisão: Comente @sourcery-ai review no pull request.
  • Continuar as discussões: Responda diretamente aos comentários de revisão do Sourcery.
  • Gerar um problema no GitHub a partir de um comentário de revisão: Peça ao Sourcery para criar um
    problema a partir de um comentário de revisão, respondendo a ele. Você também pode responder a um
    comentário de revisão com @sourcery-ai issue para criar um problema a partir dele.
  • Gerar um título para o pull request: Escreva @sourcery-ai em qualquer lugar no título do
    pull request para gerar um título a qualquer momento. Você também pode comentar
    @sourcery-ai title no pull request para (re)gerar o título a qualquer momento.
  • Gerar um resumo do pull request: Escreva @sourcery-ai summary em qualquer lugar no
    corpo do pull request para gerar um resumo do PR a qualquer momento, exatamente onde você
    deseja. Você também pode comentar @sourcery-ai summary no pull request para
    (re)gerar o resumo a qualquer momento.
  • Gerar o guia do revisor: Comente @sourcery-ai guide no pull
    request para (re)gerar o guia do revisor a qualquer momento.
  • Resolver todos os comentários do Sourcery: Comente @sourcery-ai resolve no
    pull request para resolver todos os comentários do Sourcery. Útil se você já
    abordou todos os comentários e não quer mais vê-los.
  • Dispensar todas as revisões do Sourcery: Comente @sourcery-ai dismiss no pull
    request para dispensar todas as revisões existentes do Sourcery. Especialmente útil se você
    quiser começar do zero com uma nova revisão - não se esqueça de comentar
    @sourcery-ai review para acionar uma nova revisão!

Personalizando Sua Experiência

Acesse seu painel para:

  • Ativar ou desativar recursos de revisão, como o resumo do pull request gerado pelo Sourcery,
    o guia do revisor e outros.
  • Alterar o idioma da revisão.
  • Adicionar, remover ou editar instruções de revisão personalizadas.
  • Ajustar outras configurações de revisão.

Obtendo Ajuda

Original review guide in English

Reviewer's Guide

This PR enforces authentication across the application by updating the security filter chain, registers necessary authentication beans (AuthenticationManager and BCryptPasswordEncoder), switches the user entity’s ID generation to UUID strategy, and adds a login endpoint with its corresponding DTO.

Sequence Diagram for User Login Process

sequenceDiagram
    actor User
    participant AuthController as AuthenticationController
    participant AuthManager as AuthenticationManager

    User->>AuthController: POST /api/auth/login (AuthenticationDTO)
    AuthController->>AuthManager: authenticate(usernamePasswordToken)
    AuthManager-->>AuthController: Authentication Result (Authenticated User)
    AuthController-->>User: HTTP 200 OK (Authentication Token/Details)
Loading

ER Diagram: User Entity ID Generation Update

erDiagram
    User {
        Long id PK "Strategy changed to GenerationType.UUID"
        String login "unique, nullable=false"
        String password "nullable=false"
    }
Loading

Class Diagram: New AuthenticationDTO

classDiagram
      class AuthenticationDTO {
        <<Record>>
        +String login
        +String password
      }
Loading

Class Diagram: New AuthenticationController

classDiagram
      class AuthenticationController {
        -AuthenticationManager authenticationManager
        +ResponseEntity login(AuthenticationDTO data)
      }
      AuthenticationController ..> AuthenticationManager : uses
      AuthenticationController ..> AuthenticationDTO : uses
Loading

Class Diagram: Updated User Entity

classDiagram
      class User {
        <<Entity>>
        -Long id "Annotation: @GeneratedValue(strategy = GenerationType.UUID) added"
        -String login
        -String password
        +getAuthorities() Collection~GrantedAuthority~
        +getPassword() String
        +getUsername() String
        +isAccountNonExpired() boolean
        +isAccountNonLocked() boolean
        +isCredentialsNonExpired() boolean
        +isEnabled() boolean
      }
Loading

Class Diagram: Updated SecurityConfig

classDiagram
      class SecurityConfig {
        +SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) "Updated: enforces .anyRequest().authenticated()"
        +AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authConfig) "New method"
        +PasswordEncoder passwordEncoder() "New method (returns BCryptPasswordEncoder)"
      }
      SecurityConfig ..> HttpSecurity : configures
      SecurityConfig ..> AuthenticationConfiguration : uses
      SecurityConfig ..> AuthenticationManager : creates
      SecurityConfig ..> PasswordEncoder : creates
      SecurityConfig ..> BCryptPasswordEncoder : instantiates
Loading

File-Level Changes

Change Details Files
Enhanced security configuration to require authentication and expose key beans
  • Chained authorizeHttpRequests().anyRequest().authenticated() in the filter chain
  • Added an AuthenticationManager bean for programmatic authentication
  • Registered a BCryptPasswordEncoder bean for password hashing
src/main/java/com/otavio/aifoodapp/config/SecurityConfig.java
Changed user entity ID generation to UUID
  • Updated @GeneratedValue strategy from IDENTITY to UUID
src/main/java/com/otavio/aifoodapp/model/User.java
Added a REST endpoint for user login
  • Created AuthenticationController with a POST /api/auth/login that authenticates credentials
src/main/java/com/otavio/aifoodapp/controller/AuthenticationController.java
Introduced DTO for authentication requests
  • Defined AuthenticationDTO record with login and password fields
src/main/java/com/otavio/aifoodapp/dto/AuthenticationDTO.java

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai bot changed the title @sourcery-ai Add authentication endpoint Jun 2, 2025
Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Olá @OtavioXimarelli - Revisei suas alterações e encontrei alguns problemas que precisam ser resolvidos.

Problemas bloqueantes:

  • O endpoint de login é protegido por authenticated() (link)

Comentários gerais:

  • Seu @GeneratedValue(strategy = GenerationType.UUID) não funcionará em um ID Long—altere o tipo de campo para UUID ou mude para uma estratégia de geração numérica, como IDENTITY ou AUTO.
  • O endpoint de login atualmente retorna o objeto Authentication bruto—considere mapeá-lo para um DTO seguro ou emitir um JWT em vez de expor detalhes de autenticação internos.
  • Prefira a injeção de construtor em vez de @Autowired de campo em AuthenticationController para melhorar a testabilidade e a imutabilidade.
Aqui está o que eu examinei durante a revisão
  • 🟡 Problemas gerais: 4 problemas encontrados
  • 🟢 Segurança: tudo parece bom
  • 🟢 Teste: tudo parece bom
  • 🟢 Complexidade: tudo parece bom
  • 🟢 Documentação: tudo parece bom

Sourcery é gratuito para código aberto - se você gosta de nossas análises, considere compartilhá-las ✨
Ajude-me a ser mais útil! Clique em 👍 ou 👎 em cada comentário e usarei o feedback para melhorar suas análises.
Original comment in English

Hey @OtavioXimarelli - I've reviewed your changes and found some issues that need to be addressed.

Blocking issues:

  • Login endpoint is protected by authenticated() (link)

General comments:

  • Your @GeneratedValue(strategy = GenerationType.UUID) won’t work on a Long id—either change the field type to UUID or switch to a numeric generation strategy such as IDENTITY or AUTO.
  • The login endpoint currently returns the raw Authentication object—consider mapping it to a safe DTO or issuing a JWT rather than exposing internal authentication details.
  • Prefer constructor injection over field @Autowired in AuthenticationController to improve testability and immutability.
Here's what I looked at during the review
  • 🟡 General issues: 4 issues found
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines 17 to 19
public class AuthenticationController {
@Autowired
private AuthenticationManager authenticationManager;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Prefira a injeção de construtor em vez da injeção de campo

Isso melhora a testabilidade e torna as dependências explícitas.

Suggested change
public class AuthenticationController {
@Autowired
private AuthenticationManager authenticationManager;
public class AuthenticationController {
private final AuthenticationManager authenticationManager;
public AuthenticationController(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
Original comment in English

suggestion: Prefer constructor injection over field injection

It improves testability and makes dependencies explicit.

Suggested change
public class AuthenticationController {
@Autowired
private AuthenticationManager authenticationManager;
public class AuthenticationController {
private final AuthenticationManager authenticationManager;
public AuthenticationController(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}

Comment on lines 21 to 27
@PostMapping("/login")
public ResponseEntity login(@RequestBody @Valid AuthenticationDTO data) {
var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);

return ResponseEntity.ok(auth);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Especifique um tipo genérico para ResponseEntity

Usar um tipo específico como ResponseEntity<Authentication> ou um DTO personalizado melhora a segurança de tipo e evita tipos brutos.

Suggested change
@PostMapping("/login")
public ResponseEntity login(@RequestBody @Valid AuthenticationDTO data) {
var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);
return ResponseEntity.ok(auth);
}
@PostMapping("/login")
public ResponseEntity<Authentication> login(@RequestBody @Valid AuthenticationDTO data) {
var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);
return ResponseEntity.ok(auth);
}
Original comment in English

suggestion: Specify a generic type for ResponseEntity

Using a specific type like ResponseEntity<Authentication> or a custom DTO enhances type safety and avoids raw types.

Suggested change
@PostMapping("/login")
public ResponseEntity login(@RequestBody @Valid AuthenticationDTO data) {
var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);
return ResponseEntity.ok(auth);
}
@PostMapping("/login")
public ResponseEntity<Authentication> login(@RequestBody @Valid AuthenticationDTO data) {
var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);
return ResponseEntity.ok(auth);
}

var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
var auth = this.authenticationManager.authenticate(usernamePassword);

return ResponseEntity.ok(auth);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 issue (security): Evite retornar o objeto Authentication completo na resposta

Retorne apenas os dados de autenticação necessários, como um token JWT ou um DTO mínimo, para evitar expor detalhes de segurança internos.

Original comment in English

🚨 issue (security): Avoid returning full Authentication object in response

Return only the necessary authentication data, such as a JWT token or a minimal DTO, to avoid exposing internal security details.

OtavioXimarelli and others added 22 commits June 2, 2025 21:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants