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 :
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:
figura 1 |
figura 2 |
figura 3 |
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 - 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:
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é...
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Programando o sistema de segurança do Access - Macoratti ...