Source for file perms.classe.php

Documentation is available at perms.classe.php

  1. <?
  2.     /**
  3.      * permissoes.classe.php
  4.      * 
  5.      * Esta classe inicializa as informações de permissões e retorna a permissão ou não de determinado
  6.      * recurso dados o recurso (ucase) e o ator
  7.      * 
  8.      * @filesource
  9.      * @package Soomp
  10.      * @author Marcio Merlone <mmerlone@gmail.com>
  11.      * @version 1.0
  12.      * @since 31/08/2006
  13.      * @copyright 2008 Soomp
  14.      */
  15.     /* $Id: perms.classe.php,v 1.1 2007/05/24 20:21:58 mmerlone Exp $ */
  16.  
  17.     require_once(CFG_LOCAL_FRAMEWORK.'stdio.classe.php');
  18.     require_once(CFG_LOCAL_FRAMEWORK.'usuario.classe.php');
  19.     require_once(CFG_LOCAL_FRAMEWORK.'grupo.classe.php');
  20.      /**
  21.       * Classe de permissões de acesso
  22.       * 
  23.       * As permissões são calculadas baseando-se nas informações:
  24.       * - (bitsUser) Grupos do usuário $objUser->grupos (array de objetos de grupo)
  25.       * - (bitsActions) Bits de permissão do módulo definidas em $req->objConfig->actions
  26.       * - (bitsPerm) Bits de permissão de grupos armazenadas em $req->objConfig->permissions
  27.       * ou no banco de dados:
  28.       * <code>
  29.       *    CREATE TABLE `TB_PERMS` (
  30.       *      `PK_PERM` int(11) unsigned NOT NULL auto_increment,
  31.       *      `NO_MODULO` varchar(32) NOT NULL,
  32.       *      `FK_GRUPO` int(11) NOT NULL,
  33.       *      `BITS_PERM` varchar(255) NOT NULL default '0',
  34.       *      PRIMARY KEY  (`PK_PERM`),
  35.       *      UNIQUE KEY `NO_MODULO` (`NO_MODULO`,`FK_GRUPO`)
  36.       *    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  37.       * </code>
  38.       * 
  39.       * O array $req->objConfig->permissions ou o campo BITS_PERM armazenam para
  40.       * o grupo FK_GRUPO um número decimal inteiro correspondente à soma dos
  41.       * inteiros de cada ação a que o grupo tem direito conforme definido em
  42.       * $req->objConfig->actions.
  43.       * Caso encontre-se um array ou string (que represente um array) ao invés
  44.       * de um número decimal inteiro assume-se que existam sub-tipos de ação
  45.       * ($_GET['t']), onde então usa-se o valor de índice $_GET['t'] do array.
  46.       * 
  47.       * Assume-se que:
  48.       * - PK_GRUPO = 0 ou PK_USUARIO = 0 (zero) é administrador e tem todas
  49.       * as permissões.
  50.       * - Se o valor da permissão para a ação for 0 (zero) todos têm permissão
  51.       * ($module_conf->actions[$_GET['a']][0] = 0)
  52.       * 
  53.       * No diretório do módulo controlador ($req->strPath) deve-se criar o arquivo
  54.       * config.php com a definição da classe module_conf e as definições do
  55.       * módulo, entre elas o $actions e opcionalmente o $permissions caso seja
  56.       * hard-coded:
  57.       * <code>
  58.       *    public $actions = array('lista'    => array(1,  array('id' => 0, 'value' => 'Listagem dos grupos')),
  59.       *                         'add'      => array(2,  array('id' => 0, 'value' => 'Adicionar novo grupo')),
  60.       *                         'del'      => array(4,  array('id' => 0, 'value' => 'Remover um grupo')),
  61.       *                         'delmulti' => array(8,  array('id' => 0, 'value' => 'Remover vários grupos em operação única')),
  62.       *                         'edit'     => array(16, array('id' => 0, 'value' => 'Editar um grupo existente')),
  63.       *                         'save'     => array(32, array('id' => 0, 'value' => 'Gravar os dados de um grupo novo ou existente'))
  64.       *                         );
  65.       * public $permissions = array(1 => 31, 6 => 17, 7 => 12, 13 => 31, 23 => 31, 29 => 0);
  66.       * </code>
  67.       * , onde no $permissions, os valores são a soma dos valores de $acoes dos
  68.       * $_GET['a'] a que o ator possui permissão e a chave (0, 1, 2, 3, 4, 5)
  69.       * corresponde ao $req->objUser->grupos do usuário logado.
  70.       * Cada valor pode ser um inteiro, objeto de permissão ou array quando
  71.       * assume-se sub-tipos dentro de cada ação, $_GET['t'] corresponde então à
  72.       * chave do array onde deve-se buscar o valor.
  73.       * @package Soomp
  74.       * @link http://us3.php.net/manual/en/language.operators.bitwise.php
  75.       */
  76.     class perms extends model{
  77.  
  78.         /**
  79.          * @var string $_strTable nome da tabela com os dados
  80.          */
  81.         protected $_strTable = 'TB_PERMS';
  82.         /**
  83.          * @var string $_strFldPk nome do campo com o pk
  84.          */
  85.         protected $_strFldPk = 'PK_PERM';
  86.         /**
  87.          * @var string $strOrdCampo campo padrão de ordenação
  88.          */
  89.         public $strOrdCampo = null;
  90.  
  91.         /**
  92.          * @var integer $bitsUser valor da permissão do usuário para o módulo/action conforme os grupos
  93.          *  É calculado efetuando operação bitwise OR (|) nos valores de $permissions correspondentes
  94.          *  ao grupo do usuário. Convertido em binário, indica os bits a que a somatória dos grupos
  95.          *  do usuáro dá acesso.
  96.          *  É ignorado se o usuário é administrdor (pertence ao grupo 0)
  97.          *  Deve assumir os valores:
  98.          *  - true para acesso incondicional de acordo com o usuário/grupos
  99.          *  - false para proibição
  100.          *  - um número inteiro que será comparado com o $bitAcao para determinar
  101.          *  o acesso.
  102.          */
  103.         protected $bitsUser = false;
  104.         /**
  105.          * @var string $t define um sub-tipo da ação
  106.          */
  107.         protected $t;
  108.         /**
  109.          * @var array $bitsPerm define as permissões para cada grupo.
  110.          *  <code>
  111.          *  $this->bitsPerm = array(12 => 0, 13 => 32, 15 => 5)
  112.          *  </code>
  113.          *  Neste exemplo:
  114.          *  - o grupo PK_GRUPO=12 não possui permissão
  115.          *  - o grupo PK_GRUPO=13 possui somente o bit 32 (100000)
  116.          *  - o grupo PK_GRUPO=15 possui os bits 1 e 4 (000101)
  117.          */
  118.         protected $bitsPerm = array();
  119.  
  120.         /**
  121.          * Construtor
  122.          */
  123.         public function __contruct(){
  124.             parent::__construct();
  125.         }
  126.  
  127.         /**
  128.          * Overload de propriedades privadas
  129.          * @param string $var nome da propriedade
  130.          * @param mixed $value valor da propriedade
  131.          */
  132.         private function __set($var$value){
  133.             $this->$var $value;
  134.         }
  135.  
  136.         /**
  137.          * Overload de propriedades privadas
  138.          * @param string $var nome da propriedade
  139.          * @return mixed valor da propriedade
  140.          */
  141.         private function __get($var){
  142.             return $this->$var;
  143.         }
  144.  
  145.         /**
  146.          * Busca as permissões de determinado módulo no banco de dados
  147.          * @param string $strModule nome do módulo do qual se desejam as permissões
  148.          * @return array $arrPerms array com as permissoes do módulo, as chaves
  149.          *  correspondem ao FK_GRUPO e os valores o número inteiro correspondente
  150.          *  aos bits de permissão do grupo (array(FK_GRUPO => BITS_PERM, ...))
  151.          */
  152.         public function getBitsPerm($strModule){
  153.             if($db &$this->getDb()){
  154.                 global $ADODB_FETCH_MODE;
  155.                 $ADODB_FETCH_MODE ADODB_FETCH_ASSOC;
  156.                 $qry 'SELECT * FROM TB_PERMS WHERE NO_MODULO='.$db->qstr($strModule);
  157.                 $arrQry $db->GetAll($qry);
  158.                 $arrPerms array();
  159.                 foreach($arrQry as $bitGroup){
  160.                     $arrPerms[$bitGroup['FK_GRUPO']] $bitGroup['BITS_PERM'];
  161.                 }
  162.                 return $arrPerms;
  163.             }
  164.         }
  165.  
  166.         /**
  167.          * Calcula os bits de permissão dado um array de bitsAction a que se tem permissão
  168.          */
  169.         public function getBitsUser($arrBits){
  170.             $bitsUser 0;
  171.             foreach($arrBits as $bit){
  172.                 $bitsUser $bitsUser $bit;
  173.             }
  174.             return $bitsUser;
  175.         }
  176.  
  177.         /**
  178.          * Cria o array no formato PK_GRUPO => PERM
  179.          * @param array $bitsPerm 
  180.          * @see perms::setBitsUser
  181.          */
  182.         public function setBitsPerm($bitsPerm){
  183.             foreach($bitsPerm as $grupo => $perm){
  184.                 if(is_object($perm)){
  185.                     $this->bitsPerm[$perm->FK_GRUPO$perm->BITS_PERM;
  186.                 }else{
  187.                     $this->bitsPerm[$grupo$bitsPerm[$grupo];
  188.                 }
  189.             }
  190.         }
  191.  
  192.         /**
  193.          * Calcula $bitsUser para o módulo solicitado e define $bitsPerm
  194.          * 
  195.          * Resume as permissões de acesso a um determinado módulo de acordo com
  196.          * os grupos do usuário.
  197.          * @param object $objUser objeto do usuário logado
  198.          * @param array $bitsPerm array com as permissões de cada grupo para um determinado módulo.
  199.          *  Pode ser um array simples no formato grupo => permissao
  200.          *  <code>
  201.          *  $bitsPermsModule = array(2 => 34, 4 => 12, ...);
  202.          *  </code>
  203.          *  Caso o módulo necessite granulação das permissões para uma mesma ação
  204.          *  o valor de permissão pode ser um array
  205.          *  <code>
  206.          *  $bitsPermsModule = array(2 => array(23, 12, 34), 4 => 12, ...);
  207.          *  </code>
  208.          *  Pode ser um array de objetos de perms (perms.classe.php) recuperados
  209.          *  do banco de dados
  210.          *  <code>
  211.          *  $bitsPermsModule = array(0 => $objPerms1,
  212.          *                           1 => $objPerms2,
  213.          *                          ...);
  214.          *  </code>
  215.          *  O $bitsPermsModule também pode ser misto, isto é, valores podem ser o
  216.          *  número inteiro, array ou o objeto mesclados, desde que não haja
  217.          *  conflito de chaves.
  218.          */
  219.         public function setBitsUser(usuario $objUser$bitsPerm){
  220.  
  221.             /**
  222.              * Garante acesso automático caso:
  223.              * - empty(bitsActions) - se existe mas é vazio então ok;
  224.              * - $objUser->PK_USUARIO = 0
  225.              * - $objUser->grupos possuir grupo com PK_GRUPO = 0;
  226.              * a ausência de permissões indica falta de configuração das
  227.              * permissões, portanto só admin.
  228.              */
  229.             // Usuário admin
  230.             if(property_exists($objUserCFG_USUARIO_DB_PK&& $objUser->{CFG_USUARIO_DB_PK=== 0){
  231.                 $this->bitsUser = true;
  232.                 return;
  233.  
  234.             // Ou grupo Admin
  235.             }else{
  236.                 if(empty($objUser->grupos)){
  237.                     $this->bitsUser false;
  238.                     return;
  239.  
  240.                 }else{
  241.                     foreach(@$objUser->grupos as $grupo){
  242.                         if($grupo->{CFG_GRUPO_DB_PK== 0){
  243.                             $this->bitsUser true;
  244.                             return;
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.  
  250.             /**
  251.              * Não é admin, tem grupos e existem permissões configuradas,
  252.              * calcula a permissão.
  253.              * Cria o array no formato PK_GRUPO => PERM
  254.              */
  255.             $this->setBitsPerm($bitsPerm);
  256.  
  257.             /**
  258.              * Calcula os bits do usuário baseado nos grupos
  259.              */
  260.             if(!empty($objUser->grupos)){
  261.                 foreach(@$objUser->grupos as $objGrupo){
  262.                     $this->setBitsGroup($objGrupo);
  263.                 }
  264.             }else{
  265.                 $this->bitsUser false;
  266.             }
  267.         }
  268.  
  269.         /**
  270.          * Define $this->bitsUser para uso com grupos
  271.          * @param grupo $objGrupo 
  272.          * @param array $bitsPerm array com as permissões de cada grupo para um determinado módulo.
  273.          */
  274.         public function setBitsGroup($objGrupo$bitsPerm false){
  275.             if($bitsPerm$this->setBitsPerm($bitsPerm);
  276.             $intPerm = isset($this->bitsPerm[$objGrupo->{CFG_GRUPO_DB_PK}]? (int) $this->bitsPerm[$objGrupo->{CFG_GRUPO_DB_PK}0;
  277.  
  278.             if(is_array($intPerm)){
  279.                 $t            = (int) $_GET['t'];
  280.                 $intPerm    $intPerm[$t];
  281.             }
  282.             $this->bitsUser = (int) ($this->bitsUser $intPerm);
  283.         }
  284.  
  285.         /**
  286.          * Retorna se há permissão para o recurso solicitado
  287.          * @param string $strAcao 
  288.          * @param integer valor de permissão do usuário, se omitido usa
  289.          *  $this->bitsUser calculado em setBitsUser
  290.          * @return boolean true ou false cfme tenha ou nao acesso
  291.          */
  292.         public function checkUser($bitAcao$bitsUser false){
  293.  
  294.             if($bitsUser){
  295.                 $this->bitsUser $bitsUser;
  296.             }
  297.  
  298.             if(is_bool($this->bitsUser)){
  299.                 return $this->bitsUser;
  300.  
  301.             }else{
  302.                 if($this->checkBit((int) $this->bitsUser(int) $bitAcao)){
  303.                     return true;
  304.                 }
  305.             }
  306.             return false;
  307.         }
  308.  
  309.         /**
  310.          * Verifica se um numero inteiro $bitsUser faz parte do valor da permissão
  311.          * $intVal através de operação bitwise
  312.          * @param integer $bitsUser valor de permissão de um usuário cfme. seus grupos, por ex. 1+2+4+16 = 23
  313.          * @param integer $bitAction valor da permissão de uma ação, por ex. 4
  314.          */
  315.         public function checkBit($bitsUser$bitAction){
  316.             if((int) $bitsUser (int) $bitAction){
  317.                 return true;
  318.             }
  319.             return false;
  320.         }
  321.     }
  322.  
  323. ?>

Documentation generated on Sun, 09 Mar 2008 23:52:53 -0300 by phpDocumentor 1.4.0

SourceForge.net Logo Support This Project