Programando o sistema de segurança do Access


Quando você usa uma base de dados Access existem dois métodos para você proteger seu banco de dados :

  1. Atribuir uma senha ao banco de dados. (leia: Implementando a segurança. )
  2. Utilizar o sistema de segurança para contas e usuários.

O primeiro caso já foi visto no artigo citado e pode ser usado para um pequeno grupo de usuários. Não sendo indicado para ser utilizado em uma rede local ou se você desejar replicar o seu banco de dados.

Apenas para relembrar , após atribuir a senha para o banco de dados para abrir a base de dados usamos o seguinte código:

Dim wrk As Workspace
Dim db As Database
Set wrk = CreateWorkspace("", "admin", "", dbUseJet)
Set db = wrkJet.OpenDatabase("arquivo.mdb", True, False, ";PWD=senha")

Usando o sistema de segurança para contas e usuários

O sistema de segurança para contas e usuários do Access pode ser resumido assim :

Para clarear vamos a um exemplo :

Você criou um grupo de usuários chamado Operadores e incluiu neste grupo os usuários José , Maria e João. A seguir você atribuiu ao grupo as seguintes permissões : Visualizar , modificar e Incluir dados na tabela Clientes. Conclusão os usuários José , Maria e João terão estas permissões herdadas do grupo a que pertencem.

Iniciando a programação da segurança do Access

Uma das primeiras coisas que você vai precisar fazer é 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. Essas informações não ficam no seu banco de dados mas em um arquivo diferente. Geralmente este arquivo tem o nome de SYSTEM.MDW , mas você pode atribuir qualquer nome a ele.

Para criar um arquivo de informação do grupo de trabalho você pode usar o utilitário WRKGADM.EXE , e , pasmem este utilitário não vem com o VB , só vem com o Access ( sacanagem do Tio Bill ). Para criar um arquivo de informação do grupo de trabalho siga os passos:

  1. Saia do Access
  2. Localize um atalho para o WRKGADM.EXE (Esta no diretório x:\windows\system ) e inicie o utilitário
  3. Voce verá a tela da figura 1 . Para criar um novo banco de dados de informação do grupo de trabalho clique em Criar :
figura 1
  1. Na tela figura 2 abaixo você vai informar o seu nome e o nome da empresa e ainda um número para tornar o seu grupo de trabalho único : O ID do grupo , com até 20 caracteres.
figura 2
  1. Ao clicar OK , vai aparecer uma caixa de diálogo solicitando o local onde voce vai gravar o seu arquivo ( aqui você pode alterar o nome do arquivo de grupo de informação )
  2. A seguir a caixa de confirmação da figura 3 irá surgir exibindo as informações fornecidas . Lembre-se de registrar essas informações a parte , pois assim você pode recuperar o arquivo se houver algum problema.
figura 3
  1. Clique em OK e você verá uma mensagem de confirmação . A seguir escolha Sair. Pronto seu novo grupo de informação de trabalho esta criado.

Quando você cria um novo arquivo de informação do grupo de trabalho este arquivo se torna o seu arquivo de grupo de trabalho padrão . Isto poderá ter implicações nos arquivos de banco de dados protegidos que já existiam antes. Assim se você estava usando o arquivo SYSTEM.MDW e criou o arquivo MACORATTI.MDW poderá ter que mudar para o arquivo .MDW original ( usando o mesmo utilitário acima ) para ter acesso aos banco de dados protegidos com este . MDW.

Para poder usar o arquivo de informação criado você deve atribuir o nome do arquivo a propriedade SystemDB do objeto DBEngine , assim :

DBEngine.System = "c:\teste\teste.mdw"

Obs: Você não precisa criar uma instância do objeto DBEngine pois ele esta sempre disponível.

Como Exibir , Criar e Excluir conta de usuários

1-Exibindo as contas dos usuários

Após criar o seu banco de dados do grupo de informação do grupo de trabalho você esta apto para criar contas de usuários , permitindo assim que um usuário se conecte ao seu banco de dados e identificando exclusivamente o seu usuário. As informações de cada usuário são armazenadas no arquivo de grupo de trabalho que você criou no item anterior.

Para exibir uma lista de conta de usuários usando a coleção Users do objeto Workspace. (Lembre-se que por padrão sempre existe o espaço de trabalho Workspaces(0) ). Vejamos abaixo o código para exibir os usuários de um certo grupo de informação :

Option Explicit
Private Usuario as User

Private Sub Form_Load()
    DBEngine.SystemDB = "c:\loca2001\system.mdw"
End Sub

Private Sub cmdMostraUsuarios_Click()
    List1.Clear
    
    For Each Usuario In Workspaces(0).Users
        List1.AddItem Usuario.Name
    Next
    
    Label1.Caption = "Usuários"

End Sub
Código para exibir usuários resultado do processamento

O motor de banco de dados Jet cria algumas contas padrão , são elas :

Obs: Em todo o código aqui usado o seu projeto deve fazer uma referência a biblioteca : Microsoft DAO 3.X Object Library feita através do menu Project | References...

2 - Criando um conta de usuário

O código para criar um conta de usuário é o seguinte:

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

On Error GoTo trata_erro:

'solicita informações para criar conta de usuario
strNome = InputBox("Informe o nome para o novo usuário. ", "Novo Usuário")
strSenha = InputBox("Informe Senha para este usuário.", "Novo Usuário")
strPID = InputBox("Informe o PID para o usuário.", "Novo Usuário")

' cria a conta com os dados informados
Set Usuario = Workspaces(0).CreateUser(strNome)
Usuario.PID = strPID
Usuario.Password = strSenha

'inclui o usuario na coleção users
Workspaces(0).Users.Append Usuario

'inclui o usuário no grupo padrão Users (no Access isto é automatico)
Set Grupo = Usuario.CreateGroup("Users")
Usuario.Groups.Append Grupo

' atualiza lista de usuários
cmdMostraUsuarios_Click
Exit Sub

trata_erro:
  MsgBox Err.Description & " ( " & Err.Number & " ) "
  Exit Sub

End Sub

Abaixo temos o projeto em execução exibindo a tela para informar o nome a seguir a última tela com o usuário já criado.

3 - Excluindo um conta de usuário

Para excluir uma conta de usuário usamos o seguinte código:

Private Sub cmdExcluiUsuario_Click()
Dim strUsuario As String

On Error GoTo trata_erro

strUsuario = InputBox("Informe qual usuário deseja Excluir.", "Excluir usuário.")
Workspaces(0).Users.Delete strUsuario

' atualiza lista de usuários
cmdMostraUsuarios_Click
Exit Sub

trata_erro:
MsgBox Err.Description & " ( " & Err.Number & " ) "
Exit Sub

End Sub

Abaixo a sequência do processamento do código:

Exibe as contas dos usuários Solicita o nome da conta a excluir Exibe as contas após a exclusão

A exclusão e realizada pela linha de código: Workspaces(0).Users.Delete strUsuario

3 - Alterando a senha para um usuário

Para alterar a senha atribuída a um usuário utilize o seguinte código:

On Error Resume Next

Dim strAntiga As String
Dim strNova As String

If List1.ListIndex = -1 Then
  MsgBox "Selecione um usuário !!! "
  Exit Sub
End If

strAntiga = InputBox("Informe a senha ATUAL para este usuário: ", "Altera Senha")
strNova = InputBox("Informe a NOVA senha para este usuário :", "Altera Senha")

Set Usuario = Workspaces(0).Users(List1.Text)
Usuario.NewPassword strAntiga, strNova

If Err = 0 Then
  MsgBox "Senha Alterada com sucesso !", vbInformation
Else
  MsgBox Err.Description
End If

End Sub

A linha de código que altera a senha usa a propriedade NewPassword para realizar a operação :

Usuario.NewPassword strAntiga, strNova

Onde devemos informar a senha Atual e a nova Senha.

Como Exibir , Criar e Apagar Grupos

Embora você possa criar usuários e atribuir permissões a cada um deles fica mais fácil se você criar grupos de usuários e atribuir permissões a esses grupos ; Assim você cria determinados grupos e atribui permissões a eles ; depois é só você criar o usuário e incluí-lo no grupo com o perfil mais próximo a ele.

Existem dois grupos que são criados pelo Jet que possuem atributos especiais , são eles :

  1. Admins - Os membros deste grupo podem criar e apagar usuários e grupos e tem a capacidade de permitir o acesso aos objetos do banco de dados e alterar senhas dos usuários.
  2. Users - é o grupo padrão o qual todos os novos usuários são incluidos quando são criados. Seus membros possuem permissão para acesso total qualquer objeto do banco de dados criado.

1 - Exibindo os grupos existentes

Para exibir os grupos existentes use o seguinte código :

Option Explicit
Private Grupo as Group
Private Sub cmdMostragrupos_Click()
List1.Clear

For Each Grupo In Workspaces(0).Groups    
   List1.AddItem Grupo.Name
Next

Label1.Caption = "Grupos"
Label2.Caption = ""

End Sub

O código exibe o nome dos grupos existentes na coleção Groups do objeto Workspace.

2 - Criando um novo grupo

Para criar um novo grupo usamos o metodo CreateGroup do objeto Workspace. Veja o código a seguir:

Private Sub cmdNovoGrupo_Click()
Dim strNome As String

On Error GoTo trata_erro

strNome = InputBox("Informe o nome do novo Grupo.", "Novo Grupo")
Set Grupo = Workspaces(0).CreateGroup(strNome)
Grupo.PID = InputBox("Informe um no. de identificação - PID - para o grupo.", "Novo Grupo") 
Workspaces(0).Groups.Append Grupo

cmdMostragrupos_Click
Exit Sub

trata_erro:
  MsgBox Err.Description & " ( " & Err.Number & " ) "
  Exit Sub

End Sub

3 - Excluindo um grupo existente

Excluir um grupo existente é simples ; basta usar o método Delete e excluir o grupo da coleção Groups. Assim:

Private Sub cmdExcluiGrupo_Click()
Dim strGrupo As String

On Error GoTo trata_erro

strGroup = InputBox("Informe o nome do grupo a excluir.", "Excluir Grupo")
Workspaces(0).Groups.Delete strGrupo

' atualiza a lista de grupos
cmdMostragrupos_Click
Exit Sub

trata_erro:
  MsgBox Err.Description & " ( " & Err.Number & " ) "
  Exit Sub

End Sub

Abaixo a tela do processameto , onde excluimos o grupo teste :

Informando o nome do grupo a excluir Exibindo a relação de grupos após a exclusão

4 - Incluindo usuários a grupos

Já vimos que quando você inclui um usuário em um grupo ele herda todas as permissões atribuidas ao grupo. Vamos mostrar como incluir um usuário em um grupo. Basicamente temos o seguinte:

  1. Para incluir um usuário a um grupo devemos criar um objeto Group usando o método CreateGroup
  2. A seguir basta anexar o objeto Group a coleção Groups

Para criar nosso projeto para exibir usuários e grupos e atribuir usuários siga os seguintes passos:

1-) Inicie um novo projeto no VB e no formulário padrão inclua os seguintes controles : Duas caixas de listagem ( LIstbox ) 4 botões de comando ; conforme figura abaixo:

1- O botão - Usuários - exibe os usuários do sistema

2- O botão - Grupos - Exibe os grupos do sistema

3- O botão - Incluir Usuário - inclui um usuários em um grupo

4- O botão - Usuários do Grupo - exibe os usuários de um determinado Grupo.

O código para exibir os usuários e os grupos já foi visto acima , então vamos mostrar somente o código do botão - Incluir Usuário - e do botão Usuários do Grupo.

1- O código do botão Incluir Usuário é o seguinte:

Private Sub cmdIncluiUsuario_Click()
On Error GoTo trata_erro

Dim NomedoGrupo As String

If List2.Text = "" Then
   Exit Sub
End If

NomedoGrupo = InputBox("Informe o nome do grupo ao qual deseja incluir o usuário " & List2.Text, "Incluir usuário a um Grupo")


Set usuario = Workspaces(0).Users(List2.Text)
Set grupo = usuario.CreateGroup(NomedoGrupo)
usuario.Groups.Append grupo

MsgBox "Usuario incluido no grupo " & NomedoGrupo & " com sucesso ! ", vbInformation
cmdGrupoUsuario

Exit Sub

trata_erro:
MsgBox Err.Description & " numero " & Err.Number
Exit Sub

End Sub

Obs: lembre-se que na seção General declarations devemos declarar as variáveis : usuario e grupo , assim :

Private usuario as User e Private grupo as Group

2- O código do botão Usuários do Grupo :

Private Sub cmdUsuariosdoGrupo_Click()
    GrupoUsuario
End Sub

Aqui na verdade temos uma chamada a rotina GrupoUsuario que irá exibir os usuários de um grupo selecionado. O código da procedure - GrupoUsuário é o seguinte:

Private Sub GrupoUsuario()

Set grupo = Workspaces(0).Groups(List1.Text)
List2.Clear

Label2.Caption = "Usuarios"

For Each usuario In grupo.Users
   List2.AddItem usuario.Name
Next

End Sub

A seguir a sequência de telas na execução do projeto usando a opção para exibir os usuários de um grupo:

Aqui selecionamos o grupo Admins e exibimos os usuários que fazem parte deste Grupo: admin e Janice

Abaixo mostramos a inclusão do usuário macoratti no grupo admins:

Selecionando o usuário e informando o grupo onde ele será incluido
O usuário macoratti já incluído no grupo admins

Atribuindo permissões a usuários e grupos

Todo o objeto no banco de dados possui um proprietário(owner) , por definição o usuário que criou o banco de dados é o proprietário dos objetos de um banco de dados e pode atribuir permissões a esses objetos.

Quando um banco de dados esta desprotegido o proprietário dos objetos deste banco de dados é o usuário admin , mas na condição de desprotegido qualquer usuário terá acesso a seus objetos. Para proteger e manter controle sobre os objetos de um banco de dados você pode fazer o seguinte:

1-) Se o banco de dados ja existir você deve transferir a propriedade de todos os objetos no banco de dados para uma conta sobre seu controle.

2-) Se você for criar um banco de dados novo , crie o banco de dados usando sua conta de usuário.

Para gerenciar os objetos de um banco de dados você vai usar os objetos Document e Container . Esses objetos são acessíveis através da coleção Containers e Documents. Vejamos a seguir os containers es

Nome do Container Descrição do Container
Databases Possui o documento do banco de dados
Forms Possui uma coleção de documentos de formulários
Modules Possui uma coleção de documentos dos módulos de código
Relationships Possui uma coleção de documentos de relacionamentos
Reports Possui uma coleção de documentos de relatórios
Scripts Possui uma coleção de documentos de macros
Tables Possui uma coleção de documentos de tabelas
SysRel Usado pelo sistema Jet

Para saber quais containers existem devemos percorrer a coleção containers. Abaixo um exemplo de código para fazer este serviço e o resultado da execução do mesmo:

Private Sub Form_Load()
Dim MeuContainer As container
Dim db As Database

Set db = OpenDatabase("c:\teste\biblio.mdb")
For Each MeuContainer In db.Containers
   List1.AddItem MeuContainer.Name
Next

End Sub

Quando um banco de dados não esta protegido todos os usuários são logados como usuário Admin sem senha, e, como o usuário admin é membro do grupo Users e Admins , ele tem acesso a qualquer objeto no banco de dados.

Quando você resolve proteger o seu banco de dados deve dar e/ou revogar permissões aos usuários e grupos para poder ter controle sobre quem tem acesso a que no banco de dados. Como os usuários herdam as permissões dos grupos , fica mais fácil você trabalhar controle a permissões por grupos.

Veja o que diz a ajuda:

"Há dois tipos de permissões: explícitas e implícitas. Permissões explícitas são aquelas concedidas diretamente a uma conta de usuário; nenhum outro usuário é afetado. Permissões implícitas são aquelas concedidas a uma conta de grupo. Adicionar um usuário ao grupo concede a esse usuário as permissões do grupo; sua remoção retira as permissões de grupo desse usuário.

Quando um usuário tenta efetuar uma operação em um objeto de banco de dados protegido, o conjunto de permissões desse usuário é baseado na interseção das suas permissões explícitas e implícitas. O nível de segurança de um usuário é sempre a menos restritiva das permissões explícitas desse usuário e das permissões de todo e qualquer grupo ao qual o usuário pertença.

Por essa razão, a maneira mais fácil de administrar um grupo de trabalho é criar novos grupos e atribuir permissões a eles, e não a usuários individualmente. Você pode, então, alterar permissões individuais de usuários adicionando-os ou removendo-os dos grupos. Além disso, se for preciso conceder novas permissões, você pode concedê-las para todos os membros de um grupo em uma única operação."

Vejamos agora quais as permissões para os objetos de um banco de dados Access:

Permissão Descrição da Permissão Esta permissão aplica-se a
dbSecNoAccess Sem acesso Todos os objetos do banco de dados exceto aos Document
dbSecFullAccess Acesso Total Todos os objetos do banco de dados
dbSecDelete Pode apagar o objeto Todos os objetos do banco de dados
dbSecReadSec Pode ler as informações de seguranca do objeto Todos os objetos do banco de dados
dbSecWriteSec Pode alterar as permissões do usuário Todos os objetos do banco de dados
dbSecWriteOwner Pode alterar a propriedade owner Todos os objetos do banco de dados
dbSecCreate Pode criar novos documentos Todos os objetos do banco de dados
dbSecReadDef Pode ler a definição da tabela O objeto Container da tabela
dbSecWriteDef Pode modificar/apagar a definição da tabela O objeto Container da tabela
dbSecRetrieveData Pode consultar os dados O objeto Container da tabela
dbSecInsertData Pode adicionar os dados O objeto Container da tabela
dbSecReplace Pode modificar os dados O objeto Container da tabela
dbSecdeleteData Pode excluir os dados O objeto Container da tabela
dbSecDBCreate Pode criar banco de dados O objeto Container do banco de dados ; Document
dbSecDBExclusive Pode abrir o banco de dados no modo Exclusivo O objeto Container do banco de dados ; Document
dbSecDBOpen Pode abrir o banco de dados O objeto Container do banco de dados ; Document
DbSecDBAdmin Pode duplicar o banco de dados e alterar sua senha O objeto Container do banco de dados

Para incluir/revogar uma permissão de uma conta de usuário siga os seguintes passos:

Vamos mostrar agora um exemplo prático desta teoria toda:

aguarde... continuará...

Inté...