SecurityBeansConfig.java

package com.albertsilva.dev.asjcatalog.security.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * Registra o {@code PasswordEncoder} da aplicação.
 *
 * <p>
 * O único bean é um {@link BCryptPasswordEncoder} com a <b>força padrão</b> do
 * framework (a força não é informada no código). Esse encoder é usado para
 * codificar senhas ({@code UserService}, {@code AccountService}), para
 * conferir a senha no login ({@code CustomPasswordAuthenticationProvider}) e
 * para codificar o segredo do cliente OAuth2
 * ({@code AuthorizationServerConfig}).
 * </p>
 */
@Configuration
public class SecurityBeansConfig {

  /**
   * Cria o {@link BCryptPasswordEncoder}. O método tem visibilidade de pacote e o
   * bean é um singleton do contexto. Cada {@code encode()} gera um hash diferente
   * (salt aleatório); {@code matches()} confere senha e hash.
   *
   * @return codificador BCrypt com a força padrão
   */
  @Bean
  PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }
}