Histórico de permissões concedidas ou revogadas

Visão Geral

Quando um administrador concede (ou remove) permissões de acesso à um usuário, nenhum registro de auditoria é gerado, sendo impossível identificar posteriormente quem alterou as permissões ou quando isso ocorreu.

O objetivo dessa implementação é passar a gerar histórico das modificação de permissões sempre que um administrador conceder ou revogar acesso à um usuário.

Como vai funcionar?

Sempre que uma permissão for concedida ou revogada, uma linha na tabela wecdb.permissionhistory será gerada.

fnc_gravar_permissao

Atualmente, a manutenção de todas as permissões acontece através da função de banco de dados wecdb.fnc_gravar_permissao. No entanto essa função não recebe a identificação do usuário que a está chamando.

Essa função precisa sofrer as seguintes modificações:

  1. Criar um parâmetro para receber a identificação do usuário que chamou a rotina (usuário logado)
  2. Para cada chamada da função, gerar uma linha na tabela wecdb.permissionhistory.
Ao adicionar o novo parâmetro na função, manter a retro compatibilidade com a assinatura anterior através da criação de uma sobrecarga de função (overloading).

Relatório de Histórico de Permissões

Um relatório de histórico de permissões deve ser desenvolvido como parte do módulo Latromi Essentials.

O novo relatório deve fica no menu:

  • LATROMI → Segurança → Relatórios → Histórico de Permissões
Ao desenvolver o relatório de histórico de permissões, é importante considerar o desempenho, especialmente se a tabela `permissionhistory` crescer significativamente ao longo do tempo.

Estrutura de banco de dados

Abaixo os scripts para modificação da estrutura de banco de dados para desenvolvimento desta rotina.

schema wecdb

SET SEARCH_PATH = wecdb;

CREATE TABLE permissionhistory
(
    id                  BISERIAL NOT NULL,
    creationtime        TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
    sessionid           BIGINT NOT NULL,
    entitytype          VARCHAR(5) NOT NULL, -- GROUP ou USER
    userid              INT,
    usergroupid         INT,
    action              CHAR(1) NOT NULL, --0-REVOKE, 1-GRANT
    permissionname      TEXT NOT NULL,
    CONSTRAINT pk_permissionhistory_id PRIMARY KEY (id),
    CONSTRAINT ck_permissionhistory_entitytype CHECK (entitytype IN ('USER', 'GROUP')),
    CONSTRAINT ck_permissionhistory_userid_or_usergroupid CHECK ((userid is null) != (usergroupid is null)),
    CONSTRAINT ck_permissionhistory_action CHECK (action IN ('R', 'G')),
    CONSTRAINT fk_permissionhistory_sessionid FOREIGN KEY (sessionid)
        REFERENCES sessaotrabalho(id) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_permissionhistory_userid FOREIGN KEY (userid)
        REFERENCES usuario(id) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_permissionhistory_usergroupid FOREIGN KEY (usergroupid)
        REFERENCES grupousuario(id) ON DELETE CASCADE ON UPDATE CASCADE
);
COMMENT ON TABLE permissionhistory IS 'Histórico de permissões. Cada vez que uma permissão é concedida ou revogada, um registro é gravado nesta tabela.';
COMMENT ON COLUMN permissionhistory.id IS 'Identificador do histórico de permissões.';
COMMENT ON COLUMN permissionhistory.creationtime IS 'Data e hora em que o registro foi criado.';
COMMENT ON COLUMN permissionhistory.sessionid IS 'Identificador da sessão de trabalho de quem concedeu ou revogou a permissão.';
COMMENT ON COLUMN permissionhistory.entitytype IS 'Tipo de entidade: "USER" ou "GROUP".';
COMMENT ON COLUMN permissionhistory.userid IS 'Identificador do usuário que recebeu ou perdeu permissão (apenas quando "entitytype" for "USER").';
COMMENT ON COLUMN permissionhistory.usergroupid IS 'Identificador do grupo de usuários que recebeu ou perdeu permissão (apenas quando "entitytype" for "GROUP").';
COMMENT ON COLUMN permissionhistory.action IS 'Tipo de ação: "G" (Grant - concessão) ou "R" (Revoke - revogação).';
COMMENT ON COLUMN permissionhistory.permissionname IS 'Código da regra de acesso específica sobre um alvo do sistema. 
Exemplos: 
- MN15: Menu de ID 15
- GRIDCOL438[VISIBLE]: Coluna com ID 438 de uma grid, ação "visibilidade"
- SM_CARROSSEL|NEW: Menu do site "Carrossel", ação "novo"';