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() )
ENDIFDoravante, 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).
Permissão de Usuários: Só informação:

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

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.

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

Essas janelas a de cima e a de baixo foi feita com o TBrowse com a função NAVEGAR() que escrevi.


