- Aplicações Multiusuário - Manual de referência


Embora tenha escrito dois artigos abordando o assunto ( Implementando Segurança e Redes: Programas Multiusuários) fiquei somente na superfície devido a sua vastidão , complexidade e profundidade .  Tentarei desta vez ser mais objetivo e abrangente(?) e tocar nas principais dúvidas que nos assolam quando vamos desenvolver um sistema multiusuário. (Não confundir com ambiente Cliente/Servidor).

Naturalmente irei abordar somente o acesso a base de dados Access ( por favor não me critiquem por isso) , pois de outra forma isto aqui iria se tornar um livro gigantesco. Além do mais creio que a maioria dos usuários ainda utiliza esta plataforma. Mesmo assim devido as diferentes versões do Jet Engine a tarefa é complexa e trabalhosa. Vou procurar focar o assunto nas versões 3.5 (Access 95/97)  e 3.6 do Jet (Access 2000).

Lembre-se que em se tratando de base de dados Access a questão da segurança dos dados fica um pouco comprometida conforme a versão do Jet que se esta usando. Eu já abordei isto no artigo:  Esqueceu a senha do banco de dados ??...  

Vamos tratar o assunto na forma de perguntas e respostas , adicionando , quando pertinente , exemplos para dirimir as possíveis dúvidas. Então ao trabalho...

1- Como posso implementar a segurança em uma base de dados Access ?

Aqui devemos deixar bem claro uma coisa - O Visual Basic não é uma aplicação voltada para administrar base de dados , mas para acessar base de dados e implementar interfaces com o usuário. Para implementar a segurança temos que usar o Assistente de segurança a nível de usuário, essa forma de segurança é semelhante aos métodos utilizados na maioria dos sistemas de rede. 

Na segurança em nível de usuário, ou sistema de contas , os usuários têm que se identificar através de uma chave e digitar uma senha quando iniciar o Microsoft Access. Essas informações estão dentro do arquivo de informação do grupo de trabalho (o arquivo padrão é chamado system.mdw) ali eles são identificados como membros de um grupo. O Microsoft Access fornece dois grupos padrão: administradores  e usuários mas você pode definir grupos adicionais.

Após executar o Assistente de segurança em nível de usuário, você pode atribuir ou remover permissões para contas de usuários e de grupos em seu grupo de trabalho para um banco de dados e suas tabelas, formulários, relatórios e macros existentes.

São concedidas permissões a grupos e a usuários para regular o modo pelo qual eles poderão trabalhar com cada tabela, consulta, formulário, relatório e macro em um banco de dados. Por exemplo, os membros do grupo Usuários podem ter permissão para visualizar, inserir ou modificar dados em uma tabela Clientes, mas não para alterar a estrutura dessa tabela. 

Embora o grupo Usuários possa ter permissão somente para visualizar dados em uma tabela que contenha dados de pedidos, pode não ter qualquer acesso a uma tabela Folha de Pagamento. Os membros do grupo Administradores têm permissões totais sobre todas as tabelas, consultas, formulários, relatórios e macros de um banco de dados. Você pode definir um controle mais minucioso criando suas próprias contas de grupo, atribuindo permissões apropriadas a esses grupos e, em seguida, adicionando usuários a esses grupos.

Se você precisa de controle mais rígido de diferentes grupos de usuários, pode criar seus próprios grupos, atribuir diferentes conjuntos de permissões para esses grupos e adicionar usuários aos grupos apropriados. Para simplificar o gerenciamento de permissões, é recomendado que você atribua permissões somente aos grupos (não aos usuários) e, em seguida, adicione os usuários aos grupos apropriados.

Após criar o grupo de informação você pode usar o Visual Basic para administrar completamente a segurança do MS-Jet, embora isto possa parecer uma tarefa hercúlea é perfeitamente possível.

De forma geral as operações envolvidas na proteção de um banco de dados MS-Jet são:

  1. Criar um novo banco de dados de informação - o arquivo de informação do grupo de trabalho - system.mdw
  2. Atribua uma senha ao usuário Admin
  3. Crie um novo usuário para o uso administrativo e Adicione uma conta para este usuário aos grupos Administradores (Admins) e Usuários (Users )
  4. Remova o grupo de usuários Admin de Admins
  5. Se os objetos do banco de dados , como as tabelas e as consultas , contiverem definições do banco de dados, obtenha a propriedade de todos os objetos no banco de dados criando um  novo banco de dados e importando todos os objetos do banco de dados a partir do banco de dados original.
  6. Crie grupos
  7. Atribua permissões aos grupos
  8. Crie usuários 
  9. Atribua permissões aos usuários
  10. Criptografe o banco de dados

Obs: Voce pode remover a permissão Abrir/Executar do container database para o grupo Usuários manualmente ou através do Assistente de segurança. Com isto você evita que alguém abra o seu banco de dados usando outro arquivo de grupo de trabalho ou o arquivo padrão System.mdw.

2- Como criar um arquivo de informação do grupo de trabalho ?

O arquivo de informação do grupo de trabalho é um tipo de banco de dados que armazena informações sobre os usuários e grupos. Estas informações não ficam no banco de dados mas em um arquivo distinto geralmente chamado SYSTEM.MDW (você pode criá-lo com outro nome). 

Para criar este arquivo você vai ter que usar o utilitário WRKGADM.EXE que não vem com o Visual Basic apenas com o Access . Para criar o arquivo de informação siga as etapas:

  1. Inicie o utilitário Administrador do Grupo de Trabalho . Isto irá iniciar o aplicativo e exibirá as informações sobre o arquivo de informação atual conforme a seguinte tela:
  1. Para criar um novo arquivo de informação clique em Criar... .  A caixa de diálogo Informações do Proprietário do Grupo de trabalho irá surgir conforme a seguinte tela:
  1. Forneça o seu nome e o nome de sua empresa e, para tornar seu arquivo de informação exclusivo , forneça uma identificação do grupo de trabalho usando até 20 caracteres alfanuméricos e a seguir clique no botão OK. 
  2. Uma caixa de diálogo irá solicitar a pasta na qual você deseja gravar o arquivo de informação. Conforme tela abaixo:
  1. Clique no botão OK após selecionar o diretório no qual escolheu gravar o seu arquivo de informação. A janela - Confirmar informações do grupo de trabalho irá surgir , exibindo as informações e solicitando sua confirmação. Conforme tela abaixo:
  1. Após clicar em OK você verá uma mensagem de confirmação (ver tela abaixo) clique em OK e você voltará  a caixa de diálogo inicial , encerre o aplicativo clicando no botão Sair.

Ao criar um novo arquivo de informação do grupo de trabalho você irá torná-lo o arquivo de informação padrão o que poderá influenciar os banco de dados protegidos já existentes.  Para alterar o arquivo de informação que estiver associado a seus banco de dados você deverá usar o mesmo utilitário e clicar no botão Associar... escolhendo o arquivo MDW desejado. Entendeu ???

3- Como atribuir o arquivo de informação do grupo de trabalho usando código ( DAO) ?

Após criar o seu arquivo de grupo de informação (.MDW)  você deverá designá-lo em sua aplicação Visual Basic ao banco de dados usado pelo seu sistema , isto evitará que qualquer outro arquivo seja usado indevidamente. Para fazer  isto atribua o nome do arquivo do grupo de trabalho a propriedade SystemDB do objeto DBEngine :

DBEngine.SystemDB = "C:\teste\clientes.mdw"

Lembre-se que o DBEngine é um objeto que sempre está disponível   e portanto não necessita que criamos uma instância do mesmo. Esta operação deverá ser a primeira a ser executada pela sua aplicação pois assim que você cria um objeto DAO o objeto DBEngine é iniciado e se não atribuirmos um arquivo de grupo de trabalho ao DBEngine primeiro ele irá usar qualquer arquivo que esteja configurado no ambiente de execução. 

4- Como atribuir uma senha a um banco de dados Access ?

Leia os artigos : Implementando a segurança e Esqueceu a senha do banco de dados.

5- Como exibir , criar e excluir usuários  de um sistema de contas ?

Após ter criado o seu arquivo MDW você está apto a criar as contas do usuário. É a conta do usuário que o identifica exclusivamente permitindo que ele se conecte e use o banco de dados O Jet possibilita o acesso a lista de contas dos usuários através da coleção Users do objeto Workspace. Vejamos a seguir um exemplo de como exibir todas as contas dos usuário na coleção Users.

General Declarations

Private usuario As user


Private Sub Command1_Click()
  
List1.Clear 
   For Each usuario In workspaces(0).users
       List1.AddItem usuario.Name
   Next
End Sub


Private Sub Form_Load()
    
dbengine.SystemDB = "c:\teste\system.mdw"
End Sub

No exemplo acima estamos exibindo os usuários definidos no arquivo de grupo de trabalho SYSTEM.MDW localizado em C:\TESTE . Se nenhum usuário estiver cadastrado iremos obter o seguinte resultado:

Vemos aqui exibidas as contas criadas pelo Jet como padrão para suportar operações internas.

Para criar um novo usuário usamos o método CreateUser do objeto User atribuindo o nome , a senha e o identificador exclusivo -  PID -  que é uma string de 4 até 20 caracteres que fornece exclusividade a uma conta do usuário. Através do PID e do nome do usuário podemos recrirar a conta do usuário caso nosso arquivo MDW venha se perder. Vejamos um exemplo usando código DAO de como criar uma nova conta de usuário:

Private Sub Command2_Click()
Dim strNome As String
Dim strPID As String
Dim strSenha As String

strNome = InputBox("Informe o nome do usuário.", "NOVO USUÁRIO")
strSenha = InputBox("Informe a senha do usuário.", "NOVO USUÁRIO")
strPID = InputBox("Informe o código de identificação Pessoal ( PID) .", "NOVO USUÁRIO")

Set Usuário = Workspaces(0).CreateUser(strNome)
Usuário.PID = strPID
Usuário.Password = strSenha
Workspaces(0).Users.Append Usuário

' Código necessário para incluir o usuário a um grupo 

Set Grupo = Usuário.CreateGroup("Users")
Usuário.Groups.Append Grupo

End Sub

O código destacado em azul é necessário quando usamos a DAO pois quando criamos um usuário via código DAO os mesmos não são incluídos em nenhum grupo.

Para excluir uma conta de usuário usamos o método Delete do objeto Users. A seguir damos um exemplo:

Private Sub Command3_Click()
   Dim usuario As String
   usuario = InputBox("Informe o nome do usuário a excluir", "EXCLUI USUÁRIO")
   Workspaces(0).Users.Delete usuario
   'exibe os usuários
   Command1_Click
End Sub

Obs: Não apague todas as contas do usuário Admins. Se você apagar não será mais capaz de gerenciar o seu banco de dados

6- Como Exibir , criar e excluir grupos ?

Para gerenciar um sistema de contas é muito mais prático criar grupos , atribuir aos grupos criados as permissões e a seguir incluir os usuários aos seus respectivos grupos. Para criar um grupo usamos o método CreateGroup com a seguinte sintaxe:

Set grupo = objeto.CreateGroup ( nome, pid )

Para acessar a lista de grupos que existe em um banco de dados usamos a coleção Groups do objeto Workspace. Vejamos como fazer isto no exemplo a seguir. 

Option Explicit

Private MeuGrupo as Group

Private sub cmdGrupo_click()
list1.clear

For Each MeuGroupo in Workspaces(0).Groups
      List1.additem MeuGrupo.Name
Next


End Sub

Para criar um novo grupo criamos um objeto Group usando o método CreateGroup do objeto Workspace e a seguir anexe-o á coleção Groups. O código abaixo mostra como fazer isto:

Private Sub cmdcriagrupo_Click()
Dim Nome As String

Nome = InputBox("Informe o nome do novo Grupo", "NOVO GRUPO")
Set MeuGrupo = Workspaces(0).CreateGroup(Nome)
MeuGrupo.Pid = InputBox("Informe um número de identificacao (PID) para o Grupo : ", "NOVO GRUPO")
Workspaces(0).Groups.Append MeuGrupo

If Err.Number = 0 Then
    MsgBox "O grupo => " & UCase(MeuGrupo.Name) & " foi criado com sucesso "
Else
    MsgBox "Ocorreu o erro => " & Err.Description
End If

End Sub

Finalmente para excluir um grupo , basta apagá-lo da coleção Groups usando o método Delete . Vejamos a seguir um exemplo:

Private CmdExcluiGrupo_click()
Dim nome as string

nome = inputbox("Informe o nome Grupo a excluir : ", "EXCLUIR GRUPO")
Workspace(0).Groups.Delete nome

End Sub

Observe que usamos o objeto Workspace implícito sem a necessidade de declarar uma variável de objeto para banco de dados.

Por padrão o Jet cria dois grupos que possuem atributos especiais que você deverá levar em conta quando for implementar o seu sistema de segurança. São eles os grupos : Users e Admins.

Os membros do grupo Admins poderão criar e apagar usuários e grupos com  capacidade de permitir o acesso aos objetos do banco de dados e alterar as senhas dos usuários.

O grupo Users é o grupo padrão ao qual todos os novos usuários são adicionados quando criados. Os membros deste grupo tem permissão total para acessar qualquer objeto do banco de dados criado. ( Se não fosse assim você teria que atribuir permissões aos novos usuários.)

Até mais ver...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti