Conteúdo do item:

Verificação Customizada

Como criar um anotação para validar o conteúdo de uma entrada de sua API

Links Úteis
Um site importante para leitura e aprender mais sobre seguraça em sistemas.
https://owasp.org/www-community/OWASP_Validation_Regex_Repository

Para que server ?
As validações são importantes para melhorar a segurança de nossas APIS, vamos ver hoje como fazer uma validação customizada.

Adicionando a dependência
Primeiro vamos adicionar a dependência de validação no projeto:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>


Código mostrado no vídeo
Agora vamos criar a nossa anotação em si, o nome dessa classe será o nome da anotação, nela teremos algumas anotações para configurar
- @Documented = Indica que usará a interface de anotação
- @Constraint = Qual classe que será usado o método isValid
- @Target = Onde será usado essa anotação ? Método , campo, parâmetro
- @Retention = Será retido em tempo de execução ?

package br.com.byiorio.api.infra.validators;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(validatedBy = EmailOwaspValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface EmailOwasp {
    String message() default "E-mail fora do padrão Owsap";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int max() default 200;
    boolean nullable() default false;
}

Agora vamos montar a classe que fará a validação do conteúdo. Nessa classe precisamos ter o método initialize e o isValid, no caso do isValid toda vez que retornar FALSE a verificação irá falhar e toda vez que retornar true a requisição seguirá seu curso normal.

package br.com.byiorio.api.infra.validators;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class EmailOwaspValidator implements
        ConstraintValidator<EmailOwasp, String> {
    private int max;
    private boolean nullable;

    @Override
    public void initialize(EmailOwasp emailOwsap) {
        this.max = emailOwsap.max();
        this.nullable = emailOwsap.nullable();
    }

    @Override
    public boolean isValid(String conteudo, ConstraintValidatorContext contexto) {

        if (!nullable && (conteudo == null || "".equals(conteudo.trim()))) {
            contexto.disableDefaultConstraintViolation();
            contexto.buildConstraintViolationWithTemplate("Campo Obrigatório").addConstraintViolation();
            return false;
        } else if (nullable && (conteudo == null || "".equals(conteudo.trim()))) {
            return true;
        } else if (conteudo.length() > this.max) {
            contexto.disableDefaultConstraintViolation();
            contexto.buildConstraintViolationWithTemplate("Tamanho irregular").addConstraintViolation();
            return false;
        }

        String regex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(conteudo);
        return matcher.matches();
    }

}

Outro exemplo de implementação Customizada para CPF ou CNPJ

Classe para validar o conteúdo:

import java.util.InputMismatchException;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CpfCnpjConstraintValidator implements ConstraintValidator<CpfCnpj, String> {

	@Override
	public void initialize(CpfCnpj cpfCnpjStr) {
	}

	@Override
	public boolean isValid(String cpfCnpj, ConstraintValidatorContext cxt) {
		if (cpfCnpj == null) {
			return false;
		}
		
	       if (cpfCnpj.matches("^[0-9]{11,14}$")) {
			if (cpfCnpj.length() == 11) {
				return isCPF(cpfCnpj);
			} else if (cpfCnpj.length() == 14) {
				return isCNPJ(cpfCnpj);
			} else {
				return false;
			}

		} else {
			return false;
		}

	}

	public static boolean isCPF(String CPF) {
		// considera-se erro CPF's formados por uma sequencia de numeros iguais
		if (CPF.equals("00000000000") || CPF.equals("11111111111") || CPF.equals("22222222222")
				|| CPF.equals("33333333333") || CPF.equals("44444444444") || CPF.equals("55555555555")
				|| CPF.equals("66666666666") || CPF.equals("77777777777") || CPF.equals("88888888888")
				|| CPF.equals("99999999999") || (CPF.length() != 11))
			return (false);

		char dig10, dig11;
		int sm, i, r, num, peso;

		// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
		try {
			// Calculo do 1o. Digito Verificador
			sm = 0;
			peso = 10;
			for (i = 0; i < 9; i++) {
				// converte o i-esimo caractere do CPF em um numero:
				// por exemplo, transforma o caractere '0' no inteiro 0
				// (48 eh a posicao de '0' na tabela ASCII)
				num = (int) (CPF.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso - 1;
			}

			r = 11 - (sm % 11);
			if ((r == 10) || (r == 11))
				dig10 = '0';
			else
				dig10 = (char) (r + 48); // converte no respectivo caractere numerico

			// Calculo do 2o. Digito Verificador
			sm = 0;
			peso = 11;
			for (i = 0; i < 10; i++) {
				num = (int) (CPF.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso - 1;
			}

			r = 11 - (sm % 11);
			if ((r == 10) || (r == 11))
				dig11 = '0';
			else
				dig11 = (char) (r + 48);

			// Verifica se os digitos calculados conferem com os digitos informados.
			if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
				return (true);
			else
				return (false);
		} catch (InputMismatchException erro) {
			return (false);
		}
	}

	public static boolean isCNPJ(String CNPJ) {
		// considera-se erro CNPJ's formados por uma sequencia de numeros iguais
		if (CNPJ.equals("00000000000000") || CNPJ.equals("11111111111111") || CNPJ.equals("22222222222222")
				|| CNPJ.equals("33333333333333") || CNPJ.equals("44444444444444") || CNPJ.equals("55555555555555")
				|| CNPJ.equals("66666666666666") || CNPJ.equals("77777777777777") || CNPJ.equals("88888888888888")
				|| CNPJ.equals("99999999999999") || (CNPJ.length() != 14))
			return (false);

		char dig13, dig14;
		int sm, i, r, num, peso;

		// "try" - protege o código para eventuais erros de conversao de tipo (int)
		try {
			// Calculo do 1o. Digito Verificador
			sm = 0;
			peso = 2;
			for (i = 11; i >= 0; i--) {
				// converte o i-ésimo caractere do CNPJ em um número:
				// por exemplo, transforma o caractere '0' no inteiro 0
				// (48 eh a posição de '0' na tabela ASCII)
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				dig13 = '0';
			else
				dig13 = (char) ((11 - r) + 48);

			// Calculo do 2o. Digito Verificador
			sm = 0;
			peso = 2;
			for (i = 12; i >= 0; i--) {
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				dig14 = '0';
			else
				dig14 = (char) ((11 - r) + 48);

			// Verifica se os dígitos calculados conferem com os dígitos informados.
			if ((dig13 == CNPJ.charAt(12)) && (dig14 == CNPJ.charAt(13)))
				return (true);
			else
				return (false);
		} catch (InputMismatchException erro) {
			return (false);
		}
	}

}

Classe de anotação:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(validatedBy = CpfCnpjConstraintValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface CpfCnpj {
	
	String message() default "CPF ou CNPJ com formato inválido";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};
	
}

annotation; custom; customizada; verificação; api



Redirecionar para https://www.byiorio.com.br/product/4/item/31