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 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"';