1
resposta

[Projeto] Autenticação de usuário

using System.Globalization;

string usuario;
var usuarios = new Dictionary<string, string> {
    {"admin", "123456" }
};

// funções de controle do menu
void InteracoesDoMenu ()
{
    Console.WriteLine("Informe os dados necessarios para prosseguir.");
    Console.Write("Nome de usuário: ");
    usuario = ValidarString();
    Console.Write("Senha: ");
    string senha = ValidarString();
    bool prosseguir = VerificacaoDeUsuario(usuario, senha);
    ControleDeFluxo(prosseguir, usuario);
}

void ControleDeFluxo(bool resultado, string nomeUsuario)
{
    switch (resultado)
    {
        case true: Console.WriteLine($"Bem-vindo, {nomeUsuario}"); break;
        case false: ExibirOpcoesDoMenu(); break;
        default: throw new InvalidOperationException();
    }
}

void ExibirOpcoesDoMenu()
{
    Console.Clear();
    Console.WriteLine("Usuário não cadastrado.");
    Console.WriteLine("Opções disponíveis:");
    Console.WriteLine("[1] Cadastrar novo usuário");
    Console.WriteLine("[2] Acessar como convidado");
    Console.WriteLine("[3] Sair");
    AcoesDoMenu();
}

void AcoesDoMenu ()
{
    string opcaoSelecionada;
    bool deveContinuar;

    do
    {
        opcaoSelecionada = ValidarString();
        deveContinuar = ValidarOpcao(opcaoSelecionada);
    } 
    while (deveContinuar);
        
    switch (opcaoSelecionada)
    {
        case "1": CadastrarUsuario(); break;
        case "2": Console.WriteLine("Acesso concedido como convidado."); break;
        case "3": Console.WriteLine("Finalizando sistema..."); break;
        default: throw new InvalidOperationException();
    }
}

// função para verificar usuários cadastrados
bool VerificacaoDeUsuario(string nomeUsuario, string senhaInformada)
{
    if (usuarios.TryGetValue(nomeUsuario, out string? senha))
    {
        if (senha == senhaInformada)
        {
            return true;
        }
    }
    return false;
}
// função para cadastrar novo usuário
void CadastrarUsuario()
{
    Console.WriteLine("Criar senha: ");
    string senha = ValidarString();
    usuarios.Add(usuario, senha);
    Console.WriteLine($"Novo usuário '{usuario}' cadastrado com sucesso!");
}

// funções para validar dados
bool ValidarOpcao (string opcao)
{
    if (int.TryParse(opcao, out int opcaoConvertida) && (opcaoConvertida >= 1 && opcaoConvertida <= 3))
    {
        return false;
    }
    else
    {
        Console.WriteLine("Opção inválida, tente novamente:");
        return true;
    }
}
string ValidarString ()
{
    while(true)
    {
        string entrada = Console.ReadLine()!;

        if (string.IsNullOrWhiteSpace(entrada))
        {
            Console.Write("Informação inválida, tente novamente:");
        }
        else
        {
            return entrada;
        }
    }
}

InteracoesDoMenu();
1 resposta

Oi, José! Como vai?

A forma como você organizou o código chamou bastante atenção. O uso de void para separar responsabilidades em funções como ValidarString e VerificacaoDeUsuario demonstra uma preocupação real com legibilidade e reaproveitamento de código. Além disso, trabalhar com bool e return para controlar o fluxo dentro do switch, utilizando case, break e os valores true e false, é uma abordagem limpa e bem estruturada.

Outro ponto positivo é o uso de new Dictionary<string, string> para armazenar os dados de usuario e senha. Essa é uma escolha excelente para autenticação simples, pois permite consultar rapidamente se um nomeUsuario existe antes de liberar o acesso.

Ainda sobre o dicionário usuarios, uma dica interessante para o futuro é utilizar o método ContainsKey quando você quiser apenas verificar a existência de uma chave, sem precisar acessar o valor diretamente. Veja o exemplo com Console.WriteLine para exibir o resultado:


Dictionary usuarios = new Dictionary();

string nome = "admin";

if (usuarios.ContainsKey(nome))
{
    Console.WriteLine("usuario existe");
}
else
{
    Console.WriteLine("usuario nao encontrado");
}

Esse trecho verifica se a chave existe no dicionário antes de qualquer outra ação, tornando a intenção do código mais clara e evitando erros inesperados. Combinado com o seu uso atual de TryGetValue e a variável opcaoSelecionada no controle do menu, o projeto fica ainda mais robusto.

Você pensou em como expandir esse sistema no futuro, por exemplo, adicionando validação de força de senha ou um limite de tentativas de login?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!
Conteúdos relacionados
C#: entendendo classes e structs
Criando uma solução C# no Linux Ubuntu