Durante as monitorias do curso que realizo ou em conversas informais com vários colegas de turma, percebi que muitos tem algumas dúvidas ou simplesmente não sabem por onde começar.
Então vou disponibilizar o que já fiz e fazer alguns comentários sobre o formato adotado. Vale destacar que devido à minha afinidade com o banco de dados utilizado (Firebird) fui impulsionado a adotar a seguinte estratégia: Usuário da Aplicação / Sistema = Usuário do Banco de Dados, mas pode talvez não seja a melhor forma (para mim, neste momento foi).
Ou seja, quando um usuário novo registra-se no sistema que estou desenvolvendo, eu também incluo-o no Security2.fdb (a partir da versão 2.0) que é o banco de dados do servidor Firebird onde são armazenados os usuários. O mesmo conceito vale para alteração e exclusão.
Existe muita informação à respeito deste tópico já disponível na internet, eu recomendo este link http://www.firebirdsql.org/manual/pt_br/fbutils-gsec-pt_br.html, pois embora esteja explicando o uso da ferramenta GSec (via linha de comando) que acompanha a instalação do Firebird, fornece uma boa visão de como funciona o gerenciamento de usuário pelo SGBDR.
Outro motivo que levou-me a fazer assim foi a simplicidade oferecida pela versão 2.5 com a adição dos comando DDL (Data Definition Language) CREATE/ALTER/DROP USER, veja todos os detalhes no Release Notes da versão 2.5 (versão em html).
Um ponto polêmico na utilização do Firebird é em relação a segurança de acesso ao arquivo do banco de dados (.fdb), é evidente e já está previsto melhoras neste quesito (disponível no Firebird Roadmap), mas por enquanto no portal Firebase você encontrará respostas para as seguintes perguntas:
Existe alguma maneira de impedir que o SYSDBA tenha acesso ao meu banco de dados?
Como posso proteger meu banco de dados para que outras pessoas não tenham acesso ao meu arquivo GDB/FDB?
Bem, vamos aos comandos SQLs que utilizei:
Abaixo, minha tabela de usuário. Perceba que foram utilizados domínios na sua definição e que a implementação dos mesmos encontra-se comentada logo a frente do campo da tabela.
CREATE TABLE TB$USUARIO (ID DOM$ID_SMALL NOT NULL /* DOM$ID_SMALL = SMALLINT NOT NULL */,NOME DOM$NOME_USUARIO NOT NULL /* DOM$NOME_USUARIO = VARCHAR(32) */,NOME_COMPLETO DOM$NOME_COMPLETO /* DOM$NOME_COMPLETO = VARCHAR(60) NOT NULL */,SENHA DOM$SENHA /* DOM$SENHA = VARCHAR(10) NOT NULL */,FUNCAO DOM$FLAG_CHAR NOT NULL /* DOM$FLAG_CHAR = CHAR(1) NOT NULL */,ATUALIZACAO DOM$ATUALIZACAO NOT NULL /* DOM$ATUALIZACAO = TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL */,CONSTRAINT PK_USUARIO PRIMARY KEY (ID));
Stored Procedure que centraliza a execução dos comandos DDL, sendo chamada por um trigger da tabela acima. Estou utilizando novos recursos do Execute Statement.
CREATE OR ALTER PROCEDURE SP$USER_MANAGER (I$CMD_DDL_USER VARCHAR(255),I$USER_ADMIN TYPE OF COLUMN TB$USUARIO.NOME = 'ADM',I$PASSWORD TYPE OF COLUMN TB$USUARIO.SENHA = 'senha',I$ROLE_ADMIN VARCHAR(30) = 'RDB$ADMIN')ASBEGINEXECUTE STATEMENT I$CMD_DDL_USERWITH COMMON TRANSACTIONAS USER :I$USER_ADMIN PASSWORD :I$PASSWORD ROLE :I$ROLE_ADMIN;END
CREATE USER ADMPASSWORD 'senha'FIRSTNAME 'Administrador'MIDDLENAME 'do Sistema'LASTNAME 'Unipar'GRANT ADMIN ROLE
Além disso, é necessário atribuir (em cada base de dados) a role rdb$admin ao usuário, assim:
GRANT RDB$ADMIN TO ADM
CREATE OR ALTER TRIGGER TRI$USER_MANAGER FOR TB$USUARIOACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0ASBEGINIF (INSERTING) THENEXECUTE PROCEDURE SP$USER_MANAGER('CREATE USER ' || NEW.NOME ||' PASSWORD ''' || NEW.SENHA || ''' ', 'ADM', 'senha');ELSEIF (UPDATING) THENEXECUTE PROCEDURE SP$USER_MANAGER('ALTER USER ' || OLD.NOME ||' PASSWORD ''' || NEW.SENHA || ''' ', 'ADM', 'senha');ELSEEXECUTE PROCEDURE SP$USER_MANAGER('DROP USER ' || OLD.NOME,'ADM', 'senha');END
É isso ai pessoal! O Firebird está cada vez melhor!!
Até a próxima...