Programação de permissão de usuários no sistema em Clipper

Administrar Permissão de Usuários no Clipper

Uma vez desenvolvi um método de senha para usuário. Cada usuário tinha acesso a determinada ação no sistema, dependendo do seu cargo na empresa. À pedidos, resolvi publicar o know-how.

Para que este esquema funcione, você tem que estar usando o método de compilação com .RMK e .LNK porque cada programa precisa ser uma função.

A idéia toda se baseia nas seguintes funções:

 

// atribuir permissões de usuários

SETKEY(-21, {|cPRO,nLIN,cVAR| MU_PER(cPRO,nLIN,cVAR) } ) // Ctrl+F2

 

// consultar permissões de usuário

FUNCTION PRG()
cSECAO := PROCNAME(1)
@ 24,69 SAY SPACE(10) COLOR "B/BG" // LINHA OPCIONAL
@ 24,79-(LEN(cSECAO)) SAY cSECAO COLOR "B/BG" // LINHA OPCIONAL
kIN := US->CARGO + cSECAO
AC->( DBSEEK(kIN) )
RETURN (cSECAO)

 

// a outra função é a MU_PER() que, por ser um pouco grande, está sendo fornecida no final da página e não listada.

 

Observe que o campo US->CARGO deve estar no seu arquivo de usuários, assim que o usuário entra no seu sistema ele digita o seu nome de usuário e senha, daí ele posiciona o registro no usuário corrente.

Veja um exemplo de arquivo de "usuários" e um arquivo de "cargos", abaixo:

 

*** USUARIOS - ELENCO DOS USUARIOS DO SISTEMA
IF !FILE("USUARIOS.DBF")
   aDBF := {}
   aADD( aDBF, {"CODIGO",    "C", 3, 0} ) // POSICAO 1 = CHAVE
   aADD( aDBF, {"USUARIO",   "C", 15,0} ) // POSICAO 2 = RETORNO
   aADD( aDBF, {"NOME",      "C", 35,0} ) 
   aADD( aDBF, {"CARGO",     "C", 3, 0} )
   aADD( aDBF, {"IMPRESSORA","N", 2, 0} ) // IMPRESSORA Q ESTA USANDO
   aADD( aDBF, {"SENHA",     "C",10, 0} )
   aADD( aDBF, {"SIGN",      "N", 3, 0} )
   aADD( aDBF, {"LAST_USER", "C", 3, 0} )

   DBCREATE("USUARIOS", aDBF)

   // ABRE DBF
   USE USUARIOS ALIAS US EXCLUSIVE NEW
   INDEX ON CODIGO TAG CODIGO TO USUARIOS
   SET INDEX TO USUARIOS

   // DEFINE USUARIO MESTRE = "SUPERVISOR"
   US->( DBAPPEND())
   US->USUARIO = "SUPERVISOR"
   US->SENHA   = CRIPT("1111111111", "USUARIOS")
   TSTSENHA    = CRIPT("1111111111", "USUARIOS")
   TSTSENHA    = DESCRIPT(US->SENHA, "USUARIOS")
   US->CARGO   = "001" // SUPERVISOR


   ACESSO(US->CARGO, .T.) // ATRIBUI ACESSO TOTAL AO SISTEMA

   IF !FILE("CARGOS.DBF")
      aDBF := {}
      aADD( aDBF, {"CODIGO",    "C",  3,0} ) // POSICAO 1 = CHAVE  
      aADD( aDBF, {"CARGO",     "C", 20,0} ) // POSICAO 2 = RETORNO -nome do cargo
      aADD( aDBF, {"SIGN",      "N",  3,0} )
      aADD( aDBF, {"LAST_USER", "C",  3,0} )

      DBCREATE("CARGOS", aDBF)

 

      // ABRE DBF
      USE CARGOS ALIAS CA EXCLUSIVE NEW
      INDEX ON CODIGO TAG CODIGO TO CARGOS
      SET INDEX TO CARGOS
   
      CA->( DBAPPEND())
      CA->CODIGO := "001"
      CA->CARGO := "SUPERVISOR"
      CA->( DBUNLOCK())
      CA->( DBCOMMIT())
      CA->( DBCLOSEAREA() )
   ENDIF

ENDIF

 

A seguir a estrutura do arquivo que irá tratar as permissões dos usuários e irá trabalhar com a nossa função:

 

*** ACESSO - PERMISSAO DOS USUARIOS
IF !FILE("ACESSO.DBF")
   aDBF := {}
   aADD( aDBF, {"CODIGO",    "C", 3,0} ) // CODIGO DO CARGO DO USUARIO
   aADD( aDBF, {"SECAO",     "C",10,0} ) // SECAO DO SISTEMA
   aADD( aDBF, {"ACESSAR",   "L", 1,0} )
   aADD( aDBF, {"INSERIR",   "L", 1,0} )
   aADD( aDBF, {"ALTERAR",   "L", 1,0} )
   aADD( aDBF, {"EXCLUIR",   "L", 1,0} )
   aADD( aDBF, {"IMPRIMIR",  "L", 1,0} )
   aADD( aDBF, {"SIGN",      "N", 3,0} )
   aADD( aDBF, {"LAST_USER", "C", 3,0} )

   DBCREATE("ACESSO", aDBF)

   USE ACESSO ALIAS AC EXCLUSIVE NEW
   INDEX ON CODIGO+SECAO TAG CODACE TO ACESSO
   AC->( DBCLOSEAREA() )
ENDIF

 

Doravante, basta colocar a seguinte linha no início de cada programa:

 

pATUAL := PRG()

 

...e antes de qualquer ação do sistema, teste a permissão do usuário:

 

IF !AC->EXCLUIR //Testa se o usuário pode excluir o registro
   MSGBOX1("Negado", "Permissão de Exclusão")

   RETURN

ENDIF

 

Muito bem, agora você deve estar se perguntando: ...mas, como eu vou fazer para definir as permissões? Onde vou atribuir qual tipo de acesso cada usuário vai poder ter em cada programa???

Bem, como já dito, só o supervisor poderá atribuir acessos ao sistema, então primeiro passo: o usuário SUPERVISOR entra e visita cada programa e tecla CTRL + F2, aí é aberta uma janela com todos os cargos e permissões para você definir.

Insira a linha a seguir no programa principal do seu sistema:

 

SETKEY(-21, {|cPRO,nLIN,cVAR| MU_PER(cPRO,nLIN,cVAR) } ) // Ctrl+F2

 

A função MU_PER() irá atribuir as permissões dos usuários.

 

A seguir, estou disponibilizando alguns fontes que usei no meu sistema de contabilidade que nunca terminei... hehehe. Só os fontes que interessa aqui, ok?! Estes fontes usam a VL2 (Visual Lib 2 -Disponível na página de Downloads).

 

downloadDownloads realizados:

 

Permissão de Usuários: Só informação:

permissão de usuários

 

Pressionando CTRL+F2 na manutenção de empresas, abre a janela de permissão de acesso dos usuários:

permissão de acesso

 

A coluna "grupo" fica congelada e as demais colunas "rolam" para esquerda e direita. Em nosso exemplo temos: Acessar, Inserir, Alterar, Excluir e Imprimir. Onde tem "ü" permite, onde tem "X" proíbe acesso.

nível de acesso

 

Outras telas dos PRGs fornecidos, observe os nomes deles no canto inferior direito da tela.

Usuários cadastrados

grupos de usuários

muda senha de usuário