Esquema de acesso

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Esquema de acesso

Mensagem por MARCELOG »

Olá pessoal,
em meus sistemas utilizo um "esquema" de acesso/ autorizações por níveis.
Ao cadastrar o usuário que terá acesso ao sistema, define-se um nível para o mesmo.
Com base nesse nível, as ações são controladas. Ex:
Nível 1 - inclui
Nivel 2 - inclui e altera
Nivel 3 - inclui, altera e exclui
etc.
Mas agora quero implementar um ajuste fino. Definindo o que cada usuário pode fazer em cada cadastro/ rotina.
Minhas idéias nesse sentido vão desde a criação de campos para os diversos cadastros, até a utilização de único campo com string criptografada para definição de acesso/ autorização.
Mas a experiência conta muita.
E sei que muitos de vocês já utilizam esse procedimento.
Se alguém se "habilitar", gostaria de saber a sua opinião e experiência a respeito.
Desde já obrigado.

MarceloG
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Amigo,

Eu utilizo o sistema de acesso a CADA ITEM do MENU. No arquivo de USUÁRIO crio um CAMPO para cada item do menu do sistema. No cadastro de usuarios, defino se o usuário é SUPERVISOR (com acesso a TODO o sistema) ou se o usuário é OPERADOR (com acesso APENAS onde lhe for dado acesso).

Somente o usuário SUPERVISOR pode cadastrar outros usuários... dizer onde cada um pode entrar... cadastrar as impressoras... etc.

Com as funções da VISUAL LIB, esse método fica fácil, fácil. Veja:

Código: Selecionar todos

///////////////////////////////////////////////
// Sub menu de CADASTROS

AddDownItem( mCONPAG, "&Cadastros Gerais"  ,, mCADPAG )
AddDownItem( mCONPAG, "&Movimento Diario"  ,, mLANPAG )
AddDownItem( mCONPAG, "&Relatorios Gerais" ,, mRELPAG )

AddDownItem( mCADPAG, "Cadastra &Fornecedores"                   ,, { || P17CCRE() } )
AddDownItem( mCADPAG, "Cadastra Tipo de &Documento"              ,, { || P16CTDC() } )
AddDownItem( mCADPAG, "Cadastra &Matriz e Filial"                ,, { || P17CEMP() } )
AddDownItem( mCADPAG, "Cadastra &Produto de Compra"              ,, { || P17CPRD() } )
AddDownItem( mCADPAG, "Cadastra Grupo de Produtos"               ,, { || S13CGPR() } )
AddDownItem( mCADPAG, "Cadastra Sub Grupo de Produtos"           ,, { || S13CSGP() } )

if( SENHA->TIPUSU = "S" .OR. SENHA->P17CCRE  = .T., SETDOWNITEM( mCADPAG, 01, .T. ), SETDOWNITEM( mCADPAG, 01, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->P16CTDC  = .T., SETDOWNITEM( mCADPAG, 02, .T. ), SETDOWNITEM( mCADPAG, 02, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->P16CTDC  = .T., SETDOWNITEM( mCADPAG, 02, .T. ), SETDOWNITEM( mCADPAG, 02, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->P17CEMP  = .T., SETDOWNITEM( mCADPAG, 03, .T. ), SETDOWNITEM( mCADPAG, 03, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->P17CPRD1 = .T., SETDOWNITEM( mCADPAG, 04, .T. ), SETDOWNITEM( mCADPAG, 04, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->S13CGPR1 = .T., SETDOWNITEM( mCADPAG, 05, .T. ), SETDOWNITEM( mCADPAG, 05, .F. ) )
if( SENHA->TIPUSU = "S" .OR. SENHA->S13CSGP1 = .T., SETDOWNITEM( mCADPAG, 06, .T. ), SETDOWNITEM( mCADPAG, 06, .F. ) )
Um abraço,

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Tche, faço que nem vc Janio....até acabei de postar pra um colega na seção do CLIPPER um exemplo...


Abraços
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
ERCS123
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 28 Jul 2007 19:54
Localização: franca

Mensagem por ERCS123 »

Olá Janio, estou querendo melhorar meu controle de senhas. EU não tenho muita pratica na programacao, por isso, teria como voce me explicar com mais detalhes esse seu exemplo?
Obrigado

Ewerton
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Colega,

Acho que já está bem detalhado como uso... de qualquer maneira, vou tentar explicar de novo.

1-) Vc deve ter um DBF onde fique guardadas as informações sobre os usuário cadastrados para ter acesso ao seu sistema.

2-) Nesse DBF, dentre outros campos, vc tem NOME DO USUÁRIO, SENHA, TIPO DE USUÁRIO, etc..etc... e o nome do PRG (item do menu) que vc dará ou nao acesso ao usuário. Nesse campo vc gravará S (se tiver acesso) ou N (se não tiver acesso). Exemplo: Digamos que seu PRG de cadastro de CIDADES seja CADCID.PRG. Então, no DBF dos usuario crie também o campo CADCID. Se vc quiser dar acesso ao usuário JANIO, digamos, ao cadastro de CIDADES, vc deve gravar no campo CADCID "S". Se o usuário JANIO não deve ter acesso ao cadastro de cidades, grave no campo CADCID "N". Daí, usando a VISUAL LIB é só aplicar o esquema acima.

Relembrando:

Código: Selecionar todos

/////////////////////////////////////////////// 
// Sub menu de CADASTROS 


// menu de cadastro de cidades 'apontando' para o prg CADCID
AddDownItem( mCADPAG, "Cadastra Cidades" ,, { || CADCID() } ) 

// se USUÁRIO for SUPERVIDOR ou se USUÁRIO tiver "S" no CADCID, tem acesso
if( SENHA->TIPUSU = "S" .OR. SENHA->CADCID  = "S", SETDOWNITEM( mCADPAG, 01, .T. ), SETDOWNITEM( mCADPAG, 01, .F. ) ) 
é +ou- isso.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Colega ERCS123, vc esta usando a Visual Lib ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Depois de ver o esquema de acesso do mysql, modifiquei o esquema que utilizava.

Tô usando mysql, mas com dbf é a mesma coisa.

Crie um arquivo de nome USUARIO (ou outro) para armazenar as informações de usuário e senha.

Crie outro arquivo de nome ACESSO (ou outro) para armazenar o nome do usuário, recurso e permissão.

Também crie um índice com os campos usuario e recurso.

A senha do usuário, no arquivo USUARIO, deve ser criptografada.

Da mesma forma, todos os dados em ACESSO devem ser criptografados.

Use a função crypt(string,chave) para isso.

Considerando um usuário com o seguinte perfil temos:

nome:usuario
senha:teste

recurso:cliente
permissão:inserir, alterar, excluir

No processo de gravação dos dados nos arquivos, use:

USUARIO->nome:='usuario'
USUARIO->senha:=CRYPT('teste','minhachave')

ACESSO->usuario:=CRYPT('usuario','minhachave')
ACESSO->recurso:=CRYPT('cliente','minhachave')
ACESSO->permissao:=CRYPT('inserir,alterar,excluir','minhachave')

Para acessar o sistema, o operador deve digitar um nome e senha que, criptografada, deve estar gravada no arquivo ACESSO.

Para acessar o recurso 'cliente', partindo do pressuposto de que o nome do usuário está gravado numa variável public ou private, conforme o caso, basta testar a condição.

IF ACESSO->dbseek(CRYPT(cUsuario,'minhachave')+CRYPT('cliente','minhachave')))
lInserir:=IIF('insert' IN ACESSO->permissao,.t.,.f.)
lAlterar:=IIF('alterar' IN ACESSO->permissao,.t.,.f.)
lExcluir:=IIF('excluir' IN ACESSO->permissao,.t.,.f.)
ELSE
Alert('Usuario sem acesso')
Return
ENDIF

...

É mais ou menos isso.

MarceloG

Ps: como você vê, o controle é realizado em nível de função/ recurso e não em nivel de menu.
Contudo, dá prá adaptar perfeitamente.
Editado pela última vez por MARCELOG em 03 Ago 2007 15:00, em um total de 1 vez.
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Digo,

IF ACESSO->(dbseek(CRYPT(cUsuario,'minhachave')+CRYPT('cliente','minhachave')))
lInserir:=IIF('insert' IN ACESSO->permissao,.t.,.f.)
lAlterar:=IIF('alterar' IN ACESSO->permissao,.t.,.f.)
lExcluir:=IIF('excluir' IN ACESSO->permissao,.t.,.f.)
ELSE
Alert('Usuario sem acesso')
Return
ENDIF
Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Mensagem por dbsh »

Boa Tarde, Marcelo
uso de forma similiar aos nossos colegas, utilizo um DBF com os Campos:
Usuario-Codigo do Operador
Supervisor-Quem cadastrou o operador
DataInicial-Data que foi cadastrado no sistema
DataFinal- Data Limite para utilizar o sistema
HoraInicial- Hora Inicial para utilizar o sistema
Horafinal - hora final para utilizar o sistema
Senha-Senha com ate 20 digitos
NivelDeAcessoMenu-Nivel de acesso nos menu, para cada opcao utilizo um BIT, para identificar se pode acessar aquela opção no menu
NivelDeAcessoCadastro- Nivel de Acesso nos cadastro
NivelDeAcessoFinanceiro- Nivel de Acesso no financeiro
NivelDeAcessoRelatorio- Nivel de Acesso nos relatorios

EX:

Código: Selecionar todos

//cria a janela de opcao, valores 0 posiciona a janela automaticamente
#command @ <li>,<ci>,<lf>,<cf> MENU <m> [<h:HORIZONTAL>] [NIVEL <nivel>] ;
         [WHEN <w>[,<wh>]] [VALI <v>[,<vh>]] [COLOR <cor>] [OPCAO <op>] ;
         [JANELA [<jchar>] [,[<jcor>] [,<jsombra>] ]] ;
         [TITULO <tit> [,<tli>, <tci>] [TCOR <tcor>] ]=> ;

//cria as opcões, valores 0 posiciona a janela automaticamente em menu horizontal, vertical ignora
#command @ [<li>,<ci>] OPCAO <o>[,<oh>] [ACAO <a>] [NIVEL <nivel>] ;
         [WHEN <w>[,<wh>]] [VALI <v>[,<vh>]] TO <m>  =>;
         menuopadd(<m>, <li>, <ci>, <o>, <oh>, <{a}>, <{w}>, <wh>, <{v}>, <vh>, <nivel>)

//chama outra janela
#command @ [<li>,<ci>] OPCAO <o>[,<oh>] NEXT <a> [NIVEL <nivel>] ;
         [WHEN <w>[,<wh>]] [VALI <v>[,<vh>]] TO <m>  =>;
         menuopadd(<m>, <li>, <ci>, <o>, <oh>, <a>, <{w}>, <wh>, <{v}>, <vh>, <nivel>)

@ 2, 2, 2, 70 menu Principal nivel 1
@ 0, 0, 0, 0 menu CadProduto nivel 2

@ 0, 0 opcao "Cadastro" next CadProduto nivel 3 to Principal
@ 0, 0 opcao "Relatorio" acao RelProduto nivel 4 to principal

//janela grade
@ 0, 0, 0, 0 menu CadGrade nivel 14

//cadastro de produto
@ 0, 0 opcao "Produto" acao CadastroProduto() nivel 5 to CadProduto
@ 0, 0 opcao "Grupo" acao CadastroGrupo() nivel 6 to CadProduto
@ 0, 0 opcao "SubGrupo" acao CadastrosubGrupo() nivel 7 to CadProduto
@ 0, 0 opcao "Grade" acao CadastrosubGrupo() nivel 8 to CadProduto
@ 0, 0 opcao "Departamento" acao CadastroDepartamento() nivel 9 to CadProduto

@ 0, 0 opcao "Grade" acao CadastroGrade() nivel 10 to CadGrade
@ 0, 0 opcao "Familia" acao CadastroFamilia() nivel 11 to CadGRade
@ 0, 0 opcao "Tamanho" acao CadastroTamanho() nivel 12 to CadGrade
@ 0, 0 opcao "Cor" acao CadastroCor() nivel 13 to CadGrade
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu sou mais a favor do controle por usuário. Este lance de níveis de acesso num acho legal. Mais facil criar uma tabela de usuários, ou um txt criptografado, que grava o nome e os direitos de cada um.

Faz uma rotina de login e declara as variaveis, por exemplo:

public direito_de_cadastrar_produto := .t.

Depois vai testando a variavel na hora que precisar. Assim os "níveis" ficam mais extensos, cada usuário tem sua particularidade.

Falou!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Esquema de acesso

Mensagem por Linguagemclipper »

Se eu entendí bem, tenho que ter uma lista de todas as funções/rotinas/programas que meu sistema possui e um campo para cada item dessa lista no DBF de acesso para criar um perfil de usuário, correto?
Perfil de usuário vai servir para um grupo de usuários. Se eu quiser criar um nível de acesso por usuário eu criaria um perfil exclusivo para esse usuário, correto?
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Esquema de acesso

Mensagem por Mario Mesquita »

Eu faço por usuário.

Mesmo esquema, níveis de 0 a 4. Pra mim, resolve satisfatoriamente.

Sds
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Esquema de acesso

Mensagem por JoséQuintas »

Faço por usuário, por grupo, e um grupo ainda pode estar em outro grupo.
O trabalho é igual em todos os casos, obter a lista de acessos.

https://pctoledo.org/forum/viewto ... +de+acesso

Infelizmente, como mexi em tudo depois do post, acabei desativando os fontes do github, pra evitar de aparecer alguma informação particular durante alterações, mas mesmo assim dá a idéia sobre como funciona.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder