Lançado Adianti Framework 7.6!
Clique aqui para saber mais
TemplateERP: Permissões de acesso Total x Permissões de ação Bom dia pessoal... Estava dando uma olhada no TemplateERP e realmente ajuda demais já ter um ponto de partida no controle de permissões... trabalho formidável do Pablo! Pelo que entendi as permissões são de Acesso total a um programa (Classe), ou seja, ou o cara acessa tudo ou não acessa nada, podendo acessar todas as funcionalidades da classe. E não tem opção de perm...
WG
TemplateERP: Permissões de acesso Total x Permissões de ação  
Fechado
Bom dia pessoal...

Estava dando uma olhada no TemplateERP e realmente ajuda demais já ter um ponto de partida no controle de permissões... trabalho formidável do Pablo!

Pelo que entendi as permissões são de Acesso total a um programa (Classe), ou seja, ou o cara acessa tudo ou não acessa nada, podendo acessar todas as funcionalidades da classe. E não tem opção de permissão em ações específicas, como Criar, Alterar, Excluir; etc.

Agora, vamos imaginar uma aplicação de venda; onde o usuário de perfil Vendedor pode dar um desconto máximo de 10% sobre o valor de um produto, e um usuário de perfil Gerente pode autorizar um desconto acima de 10%... Outro caso seria um usuário pode acessar uma classe podendo criar novos dados, mas não excluir....

Tem como fazer com o TemplateERP?

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (16)


FP

tbm tenho a mesma duvida
WG

Pois é Fernando... Achando uma forma de implementar isso o bicho que já é poderoso ficaria incrível!
FM

Não sei mas acho que a solução seria criar uma classe clone porem com o parametro diferente. Por exemplo cria a classe venda e da acesso a vendedores com desconto maximo de 10% e copia essa classe da o nome de venda2 por exemplo e altera somente o desconto que pode ser dado... sei lá, é uma solução !!!!
WG

Flavio, bom dia.

Já pensou num aplicativo de médio ou grande porte, com inúmeras classes onde precisar aplicar permissões tais onde em várias classes o usuário pode criar/editar mas não excluir, e em outras ele já pode também excluir? Inflaria de classes "clonadas"... o controle não pode ser da classe e sim do conjunto de classes de controle das permissões...
FM

É verdade, mas para um sistema não muito grande acho que é uma solução paliativa ao menos.... Agora fiquei com essa duvida também.... rssss Abs
WG

Então... RS..

Vamos aguardar o Pablo ter um tempinho que ele nos dá uma luz aqui..
PD

Opa,

E aí pessoal. Bom, vamos por partes.

Estamos dando suporte para uma empresa que está desenvolvendo um sistema grande de ERP. Nele, por exemplo, alguns usuários poderão realizar vendas, faturamento, etc. Outros (da área técnica), somente poderão consultar tais informações. Nesse caso, existirá um form para edição da venda, onde somente quem pode mesmo realizar a venda terá acesso. E também existirá um Form de consulta geral usando templates HTML, onde serão trazidas diversas informações, além das vendas, histórico de serviços (ordens de serviço do cliente), etc). Então nesse caso a separação foi feita entre formulário de edição e tela geral de consulta.

No caso de permissões específicas, também dá pra fazer. Em outro sistema, algumas ações da tela somente podem ser executadas por grupos específicos. Nesse caso, dentro da action, verificamos se o usuário logado no sistema está dentro do grupo que possui a permissão de executar aquela action. Podemos citar uma tela de Financeiro, onde somente o chefe do setor pode executar alguma ação. Neste caso podemos criar um grupo específico (Diretores, Diretores Financeiro), e então colocar ali dentro somente os usuários que possuem a permissão especial. No exemplo a seguir (não rodei o código), estamos verificando se o usuário logado está em tal grupo, para somente então poder realizar tal acesso:

  1. <?php
  2. $GRUPO_DIRETORES 5// define o grupo de permissão especial (não usar hard code, ver ao final dessa msg)
  3. $user SystemUser::newFromLogin(TSession::getValue('login')); // instancia o user logado
  4. $user_groups = array();
  5. foreach( $user->getSystemUserGroups() as $group // pega os grupos do usuário
  6. {
  7.     $user_groups[] = $group->id;
  8. }
  9. // verifica se ele está no grupo especial
  10. if( in_array($GRUPO_DIRETORES$user_groups))
  11. {
  12.     // executa a ação
  13. }
  14. ?>


Melhor ainda seria fazer um método checkInGroup() na classe SystemUser para verificar isso, mais ou menos assim:
  1. <?php
  2. // classe SystemUser ...
  3. public function checkInGroupSystemGroup $group)
  4. {
  5.     $user_groups = array();
  6.     foreach( $this->getSystemUserGroups() as $group )
  7.     {
  8.         $user_groups[] = $group->id;
  9.     }
  10.     return in_array($group->id$user_groups);
  11. }
  12. ?>


E então na controller:

  1. <?php
  2. $GRUPO_DIRETORES 5;
  3. $user SystemUser::newFromLogin(TSession::getValue('login'));
  4. if ($user->checkInGroup( new SystemGroup$GRUPO_DIRETORES )) )
  5. {
  6.     // executa a ação...
  7. }
  8. ?>


Nesse exemplo, o código do grupo está fixo, mas sugiro fazer uma tabela de configuração para tal:
  1. <?php
  2. // obtém o ID do grupo de diretores de tabela de configuração
  3. // $GRUPO_DIRETORES = Configuracao::newFromChave('GRUPO_DIRETORES')->valor;
  4. ?>


Abraço,
Pablo
FP

galera alguem de vcs esta desenvolvendo erp de automacao comercial? essa e minha area de atuacao, eis a duvida e possivel homologar um TEF com php ?
AR

Sou novato no frame e nem sei como eu desenvolveria isso, mas...
Se criarmos um Windows que fosse acionada a partir de um botão na SystemGroupForm onde um Programa na TMultiField estaria selecionado, consequentemente seu ID no TDBSeekButton e com o ID do Grupo e o ID do Programa adicionaríamos uma entrada para digitarmos a action a ser NEGADA (Exceção do padrão que é sempre permitir).
Daí usa-se a ideia do Pablo, usando if no início do método simplesmente NEGANDO a execução da action quando o método static da classe User retornar verdadeiro.
O método static receberia a classe Control e o método chamado (onEdit, por exemplo) e o usuário logado e retornaria True quando houvesse negação cadastrada. Assim poderia usar o método em todas as action's e só negaria quando a mesma fosse cadastrada.
SS

Olá para todos,

Alguém conseguiu implementar e que possa compartilhar?
SS

Alguém poderia dar uma ideia para implementar esse controle?
WS

E se colocarmos novos campos dentro da tabela system_program onde colocaríamos os novos campos NOVO, EDITAR, EXCLUIR, LISTAR, RELATORIO, se tiver setado com A então o usuário tem acesso ao programa tal com o botão NOVO ou EDITAR habilitado. teria que mudar apenas algumas páginas..
MC

Boa Noite

Estou usando o código checkInGroup e achei excelente, no entanto quero fazer uma correção no mesmo que segue abaixo:

  1. <?php
  2. // classe SystemUser ...
  3. public function checkInGroupSystemGroup $group)
  4. {
  5.     $user_groups = array();
  6.     foreach( $this->getSystemUserGroups() as $usergroup )  // No código original esta como $group que entra em conflito com o Parâmetro passado
  7.     {
  8.         $user_groups[] = $usergroup->id;     // Corrigir aqui também
  9.     }
  10.     return in_array($group->id$user_groups);      
  11. }
  12. ?>



Como estou utilizando !!

Simples, vamos supor que que eu tenho um mural, e este traz noticias para cada departamento assim
eu tenho uma tabela com os textos do mural e uma outra tabela que determina o que cada grupo pode
ver deste mural ( mural->Id x grupo->Id )

Criei uma view com relacionamento entre o Mural x Mural/Grupo e.....

  1. <?php
  2.             if ($muralobjs)
  3.             {
  4.                 foreach ($muralobjs as $muralobj)
  5.                 {
  6.                     if ( ( $User->checkInGroup( new SystemGroup$muralobj->MGP_GRUPO ))) and
  7.                          ( $mural_ID <> $muralobj->MUR_ID ))   // Aqui determina que a mensagem seja apresentada uma unica vez
  8.                     {
  9.                         $replaces['mural'] .= '<a '.$mural_href.' class="list-group-item">'.
  10.                                                    TDate::date2br$muralobj->MUR_DATA ).' - '.
  11.                                                    $muralobj->MUR_PREVIA.'<font color="maroon">......Leia mais</font> 
  12.                                                </a>';
  13.                         $mural_ID $muralobj->MUR_ID;                                               
  14.                     }
  15.                 }
  16.             }
  17. ?>



Pronto, cada usuário só enxerga o que ele pode ver..

Para Botões, basta determinar se este vai ou não estar habilitado conforme uma tabela de relação ou diretamente um grupo especifico como Pablo explanou acima.

Este eh apenas um pequeno exemplo do uso da Função checkInGroup.


Espero ter contribuído.

Abraços;
JL

Abri um post no fórum e me passaram esse link, alguém já fez algo a mais do que foi proposto logo acima ?
LG

Alguma novidade sobre o assunto? será implementado algo nativamente na template em novas versões?
PN

Salve Amigos, estou na fase de conhecer e avaliar a FRAMEWORK (através da demo). Uma das minhas avaliações foi perceber, de cara, a falta de um recurso de permissões de acesso um pouco mais rebuscado e fiquei pensando numa saída simples e não muito sofisticada para não complicar: (lógico que uma implementação mais elaborada seria criar uma classe de Ações e fazer a associação desta com o Grupo). Mas, por enquanto, vamos no mais simples...:

1) Incluir na tabela de GRUPOS, 4 campos (boolean) para identificar as ações que o grupo pode exercer, tipo: Incluir, Alterar, Excluir e Consultar e etc (se for o caso);
2) No CRUD do GRUPO, registrar este campo como um TCheckbox, setando os campos com o default "True";
3) Atualizar a classe do GRUPO: Para gravar os respectivos campos e incluir Função para recupera-los;
4) Agora, quando surgir a necessidade de permitir ou não o acesso do Usuário corrente a determinado Programa, basta trazer o Grupo (perfil) adequado com suas devidas ações: Incluir, Alterar, Excluir e Consultar e conforme for, ajustar a habilidade de cada botão ou cada ação a partir destas.