Página 1 de 1

Esquema de acesso

Enviado: 25 Abr 2007 14:12
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

Enviado: 25 Abr 2007 15:56
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

Enviado: 25 Abr 2007 16:52
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

Enviado: 01 Ago 2007 21:03
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

Enviado: 03 Ago 2007 09:19
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

Enviado: 03 Ago 2007 12:09
por sygecom
Colega ERCS123, vc esta usando a Visual Lib ?

Enviado: 03 Ago 2007 13:48
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.

Enviado: 03 Ago 2007 14:59
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

Enviado: 04 Ago 2007 15:54
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

Enviado: 06 Ago 2007 23:42
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!

Esquema de acesso

Enviado: 03 Set 2020 12:21
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?

Esquema de acesso

Enviado: 03 Set 2020 15:14
por Mario Mesquita
Eu faço por usuário.

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

Sds

Esquema de acesso

Enviado: 03 Set 2020 19:48
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.