Clipper On Line • Ver Tópico - Usuários/senhas/acessos/etc
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Usuários/senhas/acessos/etc

14 Jul 2015 22:02

Aqui não é bem uma contribuição.
Uso um esquema de senhas/acessos que acho prática.
Nesta semana acrescentei grupos.
Ainda estou me acostumando com essa idéia de grupos.
Só pra dar uma idéia, ainda não uso em lugar nenhum.

Como é comum pra nós programadores, fico imaginando se dá pra melhorar.

Vou mostrar como estou usando, de um modo geral, sem entrar em muitos detalhes dos fontes.

Usuários/senhas/acessos/etc

14 Jul 2015 22:12

Montagem do menu.
Um estilo que considerava tradicional.
Lembro que a idéia foi a partir de um fonte da internet.

Código:
      MenuOption( "Cadastro Genérico",            "PGENERIC",    { || pgeneric() } )
      MenuOption( "Manutenção de senhas/acessos", "PHLSENHA",    { || phlsenha() } )
      MenuOption( "Log de Utilização do Sistema", "PUTI0040",    { || puti0040() } )
      MenuOption( "Opções Anuais" )
         MenuDrop()
         MenuOption( "Fechamento anual Corrente", "HLCCANUAL",  { || hlCCAnual() } )
         MenuOption( "Fechamento Anual Informe",  "HLIRANUAL",  { || hlIRAnual() } )
         MenuOption( "Fechamento Anual Dimob",    "HLDIMANUAL", { || hlDimAnual() } )
         MenuOption( "Acerto CIC no info14",      "HLCORIR14A", { || hlCorIR14a() } )
         MenuOption( "Acerto info14 manual",      "HLCORIR14M", { || hlCorIr14m() } )
         MenuOption( "Acerto endereço DIMOB",     "XXXXX" )
         MenuUnDrop()
      MenuOption( "Ferramentas" )
         MenuDrop()
         MenuOption( "Acesso remoto",         "PTERMSVR",    { || pTermSvr() } )
         MenuOption( "Backup DBFs/MySQL",     "HL_BACKUP",   { || hl_backup() } )
         MenuOption( "Dbase JMCQuintas",      "RDBASE",      { || RDbase() } )
         MenuOption( "Lista Opções do Menu",  "LISTMENU",    { || ListMenu() } )
         MenuUnDrop()


Neste menu específico, mantive o codeblock, mas na prática ele não é usado.
Só serve pra dar erro na compilação, caso esqueça de algum.
Fiz isso porque o fonte veio de terceiros, e com fontes misturados.
Isso garante que eu não apague um fonte em uso por engano, justamente por dar erro na compilação.

Com esse estilo de menu, o nome do módulo já fica disponível pra configuração.
Ao adicionar um novo módulo, teste ou não, aparece só na minha senha.

Para a configuração basta o nome do módulo. Não interessa em que nível ele esteja.

Estando disponível pra mim, posso liberar pra outra pessoa.
E posso fazer isso via aplicativo, numa atualização, liberando pra um usuário específico, pra uma empresa específica, ou pra alguém que tenha acesso a outra opção, ou o mais comum: pra quem pode definir acessos pra outras pessoas.
Também criei uma opção que pede nome do módulo, usuário e código de controle. Finalidade: posso passar um código por telefone pra liberar pra alguém na hora, sem precisar entrar remoto ou algo mais.

Com isso, já começa uma certa restrição:
- Tem módulos que só eu tenho acesso
- Tem módulos que só o administrador do cliente tem acesso - incluindo liberar acessos a outros usuários
- Cada usuário tem seus acessos definidos, e a configuração é pra cada ítem do menu

Usuários/senhas/acessos/etc

14 Jul 2015 22:27

Como ficou fácil mexer no menu, e toda configuração é automática a partir do menu:
Aproveitei o mesmo pra acrescentar opções "ocultas", que só servem pra configuração.
Aparecem na configuração, mas não no menu.
Tipo: se pode alterar determinada informação, se fica disponível Inclui, Altera, Exclui, etc.

Supondo que o nome utilizado seja "ADMLIBERADO", um novo bloqueio só precisa de duas coisas:

1) Colocar a opção no menu, talvez em opções administrativas
2) No módulo IF TemAcesso( "ADMLIBERACREDITO" ) ...

Simples e prático.
Depois é só passar senha por telefone, adicionar automático, adicionar por acesso remoto, adicionar acesso pessoalmente, etc.

Usuários/senhas/acessos/etc

14 Jul 2015 22:36

Depois criei uma opção de importar acessos de um usuário para o outro.
Exemplo: 10 vendedores. Cadastra um, configura acessos, e para os demais basta importar os mesmos acessos do primeiro.

Nesta semana acrescentei a opção de importar acessos zerando ou não os acessos existentes.
Isso permite "acumular" acesssos para um usuário.

E a última foi a parte de grupos.
Agora basta definir os acessos do grupo vendedores, e incluir o vendedor nesse grupo.
Além do grupo, ainda dá pra acrescentar mais opções "exclusivas" para o usuário.

Usuários/senhas/acessos/etc

14 Jul 2015 22:47

Com isso apareceu um novo desafio:
Como mostrar os acessos de um determinado usuário, mostrando também os acessos vindos do grupo?

Pensei que ia ser muito trabalhoso, porque é uma daquelas rotinas...
Mas até que foi.

Acho que nem precisa dizer que recursividade é normal nisso tudo.

Resumindo:
- O menu é um único array, uma única variável
- A configuração de acessos usa essa variável
- Como criei a opção de help on-line baseada no nome do módulo (do menu), acabei criando a opção de imprimir um manual, que utiliza o array do menu + os helps baseados em cada opção do menu.

Vai ser difícil usar outro estilo.

Quanto a menu estilo Windows, tudo bem, também faço a partir do array.
Só não gostei do menu em estilo Windows, e deixo desativado.

Faltou dizer:
O menu é uma variável.
Na hora de configurar o acesso, altero o conteúdo da variável, eliminando o que o usuário não pode mexer, e elimino as opções que servem apenas pra facilitar configuração, pra não aparecerem no menu.

Usuários/senhas/acessos/etc

14 Jul 2015 23:00

Agora algumas telas de como tudo isso fica
senha1.png
senha1.png (10.6 KiB) Visualizado 5246 vezes


Tinha esquecido... essa opção "lista opções do menu" gera um TXT com todo menu.

O fonte dessa opção:
Código:
FUNCTION ListMenu()
   LOCAL mOpcoes, acMenu := {}, cTxt, nCont

   mOpcoes := MenuCria()
   ListaOpcoes( mOpcoes,,, acMenu )
   cTxt := ""
   FOR nCont = 1 TO Len( acMenu )
      cTxt += acMenu[ nCont ] + HB_EOL() + HB_EOL()
   NEXT
   HB_MemoWrit( "menuhl.txt", cTxt )
   ShellExecuteOpen( "menuhl.txt" )
   RETURN acMenu


Ela aciona a ListaOpcoes() que é recursiva (chama ela mesma)

Código:
STATIC FUNCTION ListaOpcoes( mOpcoes, nLevel, cSelecao, acMenu )
   LOCAL nCont, cModule, cDescription

   nLevel := iif( nLevel == NIL, 0, nLevel )
   nLevel := nLevel + 1
   cSelecao := iif( cSelecao == NIL, "", cSelecao )

   FOR nCont = 1 TO Len( mOpcoes )
      cModule := mOpcoes[ nCont, 3 ]
      IF ValType( cModule ) != "C"
         cModule := ""
      ENDIF
      cDescription := mOpcoes[ nCont, 1 ]
      Aadd( acMenu, Pad( cSelecao + StrZero( nCont, 2 ) + ".", 15 ) + Space( nLevel * 3 ) + cDescription + iif( Len( cModule ) !=  0, " (" + mOpcoes[ nCont, 3 ] + ")", "" ) )
      IF Len( mOpcoes[ nCont, 2 ] ) != 0
         ListaOpcoes( mOpcoes[ nCont, 2 ], nLevel, cSelecao + StrZero( nCont, 2 ) + ".", acMenu )
      ENDIF
   NEXT
   Aadd( acMenu, "" )
   RETURN NIL


É só um FOR/NEXT, e caso a opção tenha sub-opções, aciona a própria rotina pra mostrar as sub-opções, e assim sucessivamente por todos os níveis que existirem.

Usuários/senhas/acessos/etc

14 Jul 2015 23:20

Um pequeno pedaço do txt gerado:

Código:
10.07.               Apenas testes
10.07.01.               Junta corrente/informe/dimob (PTESCORR)
10.07.02.               Compara cod.locador e nome (PTESCOR2)
10.07.03.               Pega backup\recibo*.* (PTESRECMES)
10.07.04.               Gera estrutura dbfback (PTESBACK)
10.07.05.               Salva no MySql (Teste) (PTES0170)
10.07.06.               Salva no MySql (Oficial) (HLSALVAMYSQL)


Foi o que deu a idéia depois de já gerar um manual pelo aplicativo....
Só não pensei ainda como transformar isso num índice, com numeração de página.
Mas sem conteúdo não adianta.
(O manual sempre é deixado pra algum dia....)

Usuários/senhas/acessos/etc

14 Jul 2015 23:25

senha2.png


Só pra facilitar e aproveitar o que já existia, acrescentei um ( U ) para usuários e ( G ) para grupos na lista inicial.

A partir do nome, o sub-menu de opções.
Só na minha senha mostra a opção de ver senha do usuário.
É que se precisar fazer algum teste na senha de determinado usuário, posso fazer isso sem ele do lado.

Usuários/senhas/acessos/etc

14 Jul 2015 23:30

A parte de configuração segue exatamente o menu.
A única diferença é que o menu horizontal também fica na vertical durante a configuração.
Dá pra liberar um menu completo de uma vez (com todas as subopções) ou uma opção individual.
Só digitar S ou N.

senha3.png


Como falei antes, a parte de grupo é nova.
A idéia que tive, pra mostrar todos os acessos, foi colocar duas colunas: a primeira é o acesso individual, e a segunda é o acesso pelo usuário estar em determinado grupo.
Assim dá a visão geral do que ele pode mexer, sem ter que olhar o grupo.

Dá pra ver na imagem que para o usuário Barbosa, está sendo liberada a opção VENDAS por ele estar em algum grupo.

Usuários/senhas/acessos/etc

14 Jul 2015 23:38

Acontece muito de ter que liberar a mesma opção pra mais de um usuário...
Ou de precisar saber quem pode mexer em determinada opção...
Então pra facilitar... caso tecle ENTER no módulo:

senha5.png


A lista de todos que podem mexer no módulo.
Podendo incluir ou excluir usuários da opção.

senha5.png


Na lista anterior, ninguém tinha acesso.
Ao clicar em incluir, aparecem os usuários que podem ser inclusos.

Usuários/senhas/acessos/etc

14 Jul 2015 23:41

E no caso de um grupo, opção de definir membros, parecida com a rotina anterior.
Aliás, aproveitei a mesma rotina.

senha7.png


Ainda preciso ajustar o posicionamento de tudo.
Até mexi um pouco nesta semana, porque ela ainda usava o padrão antigo de 80 colunas.
Mas dá pra melhorar.

Usuários/senhas/acessos/etc

14 Jul 2015 23:46

A configuração de acessos do grupo é idêntica à de configurar acessos do usuário.

Não permiti configurar grupo dentro de grupo.

Até ontem era pra não complicar mais ainda, ou aumentar a quantidade de pesquisas no arquivo de senhas.

Mas agora pensei num motivo ainda melhor:
supondo que o grupo VENDAS tenha acesso do grupo COMPRAS, e o grupo COMPRAS tenha acesso ao grupo VENDAS.
Isso poderia gerar um loop infinito, de um grupo trazendo o acesso do outro.

Mas pra quem ainda nem usa grupo, já tá bom demais.

Usuários/senhas/acessos/etc

15 Jul 2015 00:14

E uma coisa leva a outra.....

Seria interessante a partir do usuário, ver a que grupos ele pertence.

Provavelmente essa vai ser a próxima opção.

A rotina pra toda essa navegação de acessos?
Usando recursividade... por incrível que pareça.... um FOR/NEXT.

Caso tecle ENTER numa opção com submenus, a rotina chama ela mesma passando esse array de submenus.

O fonte total no momento tem 695 linhas.

Isso inclui:
- rotina de alterar senha
- rotina de importar acessos
- rotina de mostrar senha do usuário
- rotina de selecionar membros do grupo
- rotina de selecionar usuários que acessam determinada opção
- rotina de configurar acessos individuais
- rotina que o sistema usa pra ver se determinado usuário tem acesso a determinada opção
- rotina de cadastrar novo usuário
- rotinas de menus adicionais
- linhas em branco e traços separando cada função/rotina
- anotações de data/hora sobre alterações que foram sendo feitas
- toda parte de ler/salvar no arquivo de senhas

Até ontem eu achava o fonte grande demais.
Agora que descrevi o que contém.... até que está pequeno.

A parte de grupo acrescentei duplicando algumas rotinas.

Antes que alguém pergunte:
Não uso classes nesse módulo. Vém desde os tempos do Clipper.
Nem sei se ajudaria em alguma coisa transformar em classe.

Me pergunto se precisaria alguma coisa a mais.
Até esta semana não via necessidade de acrescentar grupos, então não sei o que pode vir depois.

Usuários/senhas/acessos/etc

15 Jul 2015 00:26

Não tinha pensado nisso, mas....
Como seria algo assim em ambiente gráfico?

Usuários/senhas/acessos/etc

15 Jul 2015 09:49

JoséQuintas escreveu:Como seria algo assim em ambiente gráfico?

Lendo suas mensagens deste tópico, já estava imaginando isto, onde os GRUPOS seria um ComboBox ou RadioGroup e a Lista de privilégios em um Tree View.

Ficaria muito legal.

Abraços,
Postar uma resposta