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:
- Criar um parâmetro para receber a identificação do usuário que chamou a rotina (usuário logado)
- Para cada chamada da função, gerar uma linha na tabela
wecdb.permissionhistory.
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
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 BIGSERIAL 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
permissionid BIGINT NOT NULL,
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,
CONSTRAINT fk_permissionhistory_permissionid FOREIGN KEY (permissionid)
REFERENCES permissao (id) ON UPDATE CASCADE ON DELETE SET NULL
);
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.permissionid IS 'ID da permissão na tabela "permissao"';
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"';