Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] middleware permissoesRoles

Ao implementar permissoesRoles nas minhas rotas, por exemplo, em um cenário em que o usuário possui mais de uma role, a primeira role possui a permissão "listar" e a segunda não, o sistema traz a mensagem "Usuario não tem acesso a essa rota". Nessa situação o sistema não deveria liberar?

Acredito que o problema seja no trecho abaixo no middleware permissoesRoles

roles.map((role) => {
            possuiPermissao = role.roles_das_permissoes
                .map((permissao) => permissao.nome)
                .some((permissao) => listaPermissoes.includes(permissao))
        })

Somente para exemplificar o usuário tem 2 perfis (roles) Administrador role 1 (que possui a permissão listar) e (Operacional role 2 que não possui).

Como roles_das_permissoes que é aparece por último não tem o listar ele não funciona. Fiz um teste invertendo para que o perfil Administrador não tenha o listar e o Operacional tenha, aí a rota funciona.

Testei passando o código nessas ferramentas online e também deu o mesmo problema.

let listaPermissoes = ["Listar"];

const roles  = [
    {
        "id": 1,
        "nome": "Administrador",
        "descricao": "Perfil Administrador",
        "desativado": false,
        "usuario_inc": 1,
        "usuario_alt": 1,
        "createdAt": "2024-04-19T14:57:00.059Z",
        "updatedAt": "2024-04-19T14:57:00.059Z",
        "deletedAt": null,
        "perfis_permissoes": [
            {
                "id": 1,
                "nome": "Editar",
                "descricao": "Permissão Editar"
            },
            {
                "id": 2,
                "nome": "Listar",
                "descricao": "Permissão Listar"
            },
            {
                "id": 3,
                "nome": "Adicionar",
                "descricao": "Permissão Adicionar"
            },
            {
                "id": 4,
                "nome": "Deletar",
                "descricao": "Permissão Deletar"
            }
        ]
    }
    ,
    
    {
        "id": 4,
        "nome": "Operacional",
        "descricao": "Perfil Operacional",
        "desativado": false,
        "usuario_inc": 1,
        "usuario_alt": 1,
        "createdAt": "2024-04-19T15:03:18.620Z",
        "updatedAt": "2024-04-19T15:03:18.620Z",
        "deletedAt": null,
        "perfis_permissoes": [
            {
                "id": 1,
                "nome": "Editar",
                "descricao": "Permissão Editar"
            },
            {
                "id": 3,
                "nome": "Adicionar",
                "descricao": "Permissão Adicionar"
            },
            {
                "id": 4,
                "nome": "Deletar",
                "descricao": "Permissão Deletar"
            }
        ]
    }
    
];

let possuiPermissao = false;

  roles.map((role) => {
            possuiPermissao = role.perfis_permissoes
                .map((permissao) => permissao.nome)
                .some((permissao) => listaPermissoes.includes(permissao));
        });

console.log(possuiPermissao); //aqui retorno false
1 resposta
solução!

Olá Wagner! Como vai?

Analisando o seu código, o problema pode está na forma como o resultado de possuiPermissao é tratado dentro do map. O map é usado para transformar arrays, mas no seu caso, você está tentando usar para atribuir um valor a uma variável externa com base em uma condição. No entanto, cada iteração do map sobrescreve o valor de possuiPermissao, o que não é ideal para o seu caso.

Uma solução seria usar o método some diretamente no array roles, que irá retornar true assim que a condição for verdadeira para algum dos elementos do array, e parar de executar assim que isso acontecer. Isso é útil para o seu caso, pois você quer verificar se qualquer uma das roles possui a permissão necessária.

Aqui está como você poderia ajustar seu código:

let possuiPermissao = roles.some(role => 
    role.perfis_permissoes.some(permissao => 
        listaPermissoes.includes(permissao.nome)
    )
);

console.log(possuiPermissao); // Isso deve retornar true se alguma role tem a permissão "Listar"

Neste código, some é usado para verificar se alguma das permissões dentro de qualquer role corresponde às permissões na lista listaPermissoes. Assim que encontrar uma correspondência, ele retorna true e encerra a verificação, o que resolve o problema de sobrescrever o valor de possuiPermissao de forma inadequada.

Espero que essa solução funcione para você.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software