Pessoal,
Tenho uma aplicação (única) rodando para 34 empresas diferentes (e poderíam ser infinitas, se Deus quizer), com o mesmo banco e cada empresa tem seus próprios usuários que eles mesmos criam e gerenciam, sem qualquer interferencia minha… como?
O DB que eu uso é o MySQL.
Toda tabela tem 3 campos em comum: (owner,dta,usuario)
a) owner - é o proprietário do registro;
b) dta - data em que o registro foi criado;
c) usuário - que lançou o registro.
Criei uma função no banco chamada de PermiteAcesso. Todo acesso ao banco (grid,form,etc) tem uma cláusula WHERE com essa função, cujos parâmetros são o usuário e owner do registro.
Exempo:
…
…
…
WHERE PermiteAcesso_serv(’[sm_global_login]’,owner) = ‘Sim’ // Assim o usuário só tem acesso aos registros do grupo que ele participa
…
…
…
Meu esquema de segurança envolve 8 tabelas para controlar isso:
a) Grupos
grupos_id int(11) NOT NULL AUTO_INCREMENT,
grupos_descricao varchar(200) NOT NULL,
owner int(11) NOT NULL
b) Grupos de Acesso
grupo_acesso_id int(11) NOT NULL AUTO_INCREMENT,
grupo_acesso_descricao varchar(255) NOT NULL,
grupo_acesso_status varchar(100) NOT NULL,
owner int(11) NOT NULL
c) Grupos de Aplicação
grupo_aplicacoes_id int(11) NOT NULL AUTO_INCREMENT,
grupos_id int(11) NOT NULL,
aplicacoes_id varchar(200) NOT NULL,
grupo_aplicacoes_permissao varchar(11) NOT NULL DEFAULT ‘I;A;E;C’,
owner int(11) NOT NULL
d) Perfil de Acesso
perfil_acesso_id int(11) NOT NULL AUTO_INCREMENT,
perfil_acesso_descricao varchar(255) NOT NULL,
owner int(11) NOT NULL
e) Perfil de Grupo
perfil_grupo_id int(11) NOT NULL AUTO_INCREMENT,
perfil_acesso_id int(11) NOT NULL,
grupo_acesso_id int(11) NOT NULL,
owner int(11) NOT NULL
f) Grupo de Usuários
usuarios_id int(11) NOT NULL DEFAULT ‘0’,
grupos_id int(11) NOT NULL DEFAULT ‘0’,
owner int(11) NOT NULL
g) Usuários essa tem vários campos, mas os que controlam a segurança são
usuarios_id int(11) NOT NULL AUTO_INCREMENT,
usuarios_login varchar(200) NOT NULL,
usuarios_senha varchar(200) NOT NULL DEFAULT ‘e10adc3949ba59abbe56e057f20f883e’,
grupo_acesso_id int(11) NOT NULL,
perfil_acesso_id int(11) NOT NULL,
usuarios_datacadastro datetime NOT NULL,
owner int(11) NOT NULL
h) Aplicações
aplicacoes_id varchar(200) NOT NULL,
aplicacoes_descricao varchar(200) NOT NULL,
owner int(11) NOT NULL
*********** Início da Função ****************************
DELIMITER $$
CREATE FUNCTION PermiteAcesso
(_usuario varchar(255), _acesso int(11) ) RETURNS varchar(255) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE _grupo int DEFAULT 0;
DECLARE pesquisa1 CURSOR FOR
SELECT
perfil_grupo_id
FROM
sgci.sgci_perfil_grupo as g,
sgci.sgci_perfil_acesso as a,
sgci.sgci_usuarios as u
WHERE
g.perfil_acesso_id = a.perfil_acesso_id and
a.perfil_acesso_id = u.perfil_acesso_id and
u.usuarios_login =_usuario and
g.grupo_acesso_id = _acesso;
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done = 1;
OPEN pesquisa1;
REPEAT
FETCH pesquisa1 INTO _grupo ;
UNTIL done END REPEAT;
CLOSE pesquisa1;
IF (_grupo > 0 ) THEN
RETURN ‘Sim’;
ELSE
RETURN ‘Nao’;
END IF;
END
*************** Fim da Função ****************
Através deste sistema, aparantemente complicado, eu crio perfis de grupos que definem qual perfil de acesso tem acesso a tal grupo de acesso.
A coisa funciona ± desse jeito… é difícil explicar em poucas palavras, mas quem quizer eu envio uma aplicação pequena como exemplo.
Forte abraço.