Perfis de acesso - bjverde/formDin GitHub Wiki

Para o perfil de acesso funcionar os pré-requisitos são

  1. usuário autenticado
  2. gravar os perfis e menus no banco de dados.

O Controle padrão por menu e perfil tem apenas o acesso por tela e não tendo por componente de tela. Logo se um usuário acessa a tela poderá fazer tudo na tela.

Criando a estrutura de banco

Abaixo temos um exemplo para o MySQL 5.7 da estrutura de banco para ter o perfil de acesso. Essa estrutura foi utilizada na Aplicação de exemplo v2.5 do FormDin

Chamo atenção para a VIEW acesso_user_menu, ela irá facilitar em vários pontos.

Mer Acesso

-- -----------------------------------------------------
-- Table `form_exemplo`.`acesso_user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `form_exemplo`.`acesso_user` (
  `iduser` INT NOT NULL AUTO_INCREMENT,
  `login_user` VARCHAR(50) NOT NULL,
  `pwd_user` VARCHAR(200) NULL COMMENT 'senha criptografada com password_hash',
  `sit_ativo` VARCHAR(1) NOT NULL DEFAULT 'S',
  `dat_inclusao` DATETIME NOT NULL DEFAULT NOW(),
  `dat_update` DATETIME NULL DEFAULT now() ON UPDATE now(),
  `idpessoa` INT NULL,
  PRIMARY KEY (`iduser`),
  UNIQUE INDEX `nom_usuario_UNIQUE` (`login_user` ASC),
  INDEX `fk_acesso_user_pessoa1_idx` (`idpessoa` ASC),
  CONSTRAINT `fk_acesso_user_pessoa1`
    FOREIGN KEY (`idpessoa`)
    REFERENCES `form_exemplo`.`pessoa` (`idpessoa`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `form_exemplo`.`acesso_perfil`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `form_exemplo`.`acesso_perfil` (
  `idperfil` INT NOT NULL AUTO_INCREMENT,
  `nom_perfil` VARCHAR(45) NOT NULL,
  `sit_ativo` VARCHAR(1) NOT NULL DEFAULT 'S',
  `dat_inclusao` DATETIME NOT NULL DEFAULT NOW(),
  `dat_update` DATETIME NULL DEFAULT now() ON UPDATE now(),
  PRIMARY KEY (`idperfil`),
  UNIQUE INDEX `nom_perfil_UNIQUE` (`nom_perfil` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `form_exemplo`.`acesso_menu`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `form_exemplo`.`acesso_menu` (
  `idmenu` INT NOT NULL,
  `nom_menu` VARCHAR(45) NOT NULL COMMENT 'o nome que o usuario irá ver',
  `idmenu_pai` INT NULL COMMENT 'id do menu pai, se o pai é null então começa na raiz',
  `url` VARCHAR(300) NULL COMMENT 'caminho do item de menu',
  `tooltip` VARCHAR(300) NULL COMMENT 'decrição mais detalhada do menu',
  `img_menu` VARCHAR(45) NULL COMMENT 'Caminho da imagem será utilizada como ícone',
  `imgdisabled` VARCHAR(45) NULL COMMENT 'Caminho da imagem para o menu desabilitado',
  `dissabled` VARCHAR(1) NULL DEFAULT 'S' COMMENT 'Informa se o item de menu está habilitado ou não. N = Item de aparece porém não pode ser usada, S = Item menu aparece e pode ser clicado.',
  `hotkey` VARCHAR(45) NULL COMMENT 'Tecla de atalho',
  `boolSeparator` TINYINT NULL,
  `jsonParams` VARCHAR(300) NULL,
  `sit_ativo` VARCHAR(1) NOT NULL DEFAULT 'S' COMMENT 'Informa se o registro está ativo ou não. N = Item de nem aparece, S = Item menu aparece.',
  `dat_inclusao` DATETIME NOT NULL DEFAULT NOW(),
  `dat_update` DATETIME NULL DEFAULT now() ON UPDATE now() COMMENT 'data de update igual inclusao implica que nunca teve alteração',
  PRIMARY KEY (`idmenu`),
  INDEX `fk_acesso_menu_pai_idx` (`idmenu_pai` ASC),
  CONSTRAINT `fk_acesso_menu_pai`
    FOREIGN KEY (`idmenu_pai`)
    REFERENCES `form_exemplo`.`acesso_menu` (`idmenu`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `form_exemplo`.`acesso_perfil_menu`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `form_exemplo`.`acesso_perfil_menu` (
  `idperfilmenu` INT NOT NULL AUTO_INCREMENT,
  `idperfil` INT NOT NULL,
  `idmenu` INT NOT NULL,
  `sit_ativo` VARCHAR(1) NOT NULL DEFAULT 'S',
  `dat_inclusao` DATETIME NOT NULL DEFAULT NOW(),
  `dat_update` DATETIME NULL DEFAULT now() ON UPDATE now(),
  PRIMARY KEY (`idperfilmenu`),
  INDEX `fk_acesso_perfil_menu_acesso_perfil1_idx` (`idperfil` ASC),
  INDEX `fk_acesso_perfil_menu_acesso_menu1_idx` (`idmenu` ASC),
  CONSTRAINT `fk_acesso_perfil_menu_acesso_perfil1`
    FOREIGN KEY (`idperfil`)
    REFERENCES `form_exemplo`.`acesso_perfil` (`idperfil`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_acesso_perfil_menu_acesso_menu1`
    FOREIGN KEY (`idmenu`)
    REFERENCES `form_exemplo`.`acesso_menu` (`idmenu`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `form_exemplo`.`acesso_perfil_user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `form_exemplo`.`acesso_perfil_user` (
  `idperfiluser` INT NOT NULL AUTO_INCREMENT,
  `idperfil` INT NOT NULL,
  `iduser` INT NOT NULL,
  `sit_ativo` VARCHAR(1) NOT NULL DEFAULT 'S',
  `dat_inclusao` DATETIME NOT NULL DEFAULT NOW(),
  `dat_update` DATETIME NULL DEFAULT now() ON UPDATE now(),
  PRIMARY KEY (`idperfiluser`),
  INDEX `fk_acesso_perfil_user_acesso_user1_idx` (`iduser` ASC),
  INDEX `fk_acesso_perfil_user_acesso_perfil1_idx` (`idperfil` ASC),
  CONSTRAINT `fk_acesso_perfil_user_acesso_user1`
    FOREIGN KEY (`iduser`)
    REFERENCES `form_exemplo`.`acesso_user` (`iduser`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_acesso_perfil_user_acesso_perfil1`
    FOREIGN KEY (`idperfil`)
    REFERENCES `form_exemplo`.`acesso_perfil` (`idperfil`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- View `form_exemplo`.`acesso_user_menu`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `form_exemplo`.`acesso_user_menu`;
USE `form_exemplo`;
CREATE  OR REPLACE VIEW `acesso_user_menu` AS
select 
 u.iduser
,u.login_user
,p.idperfil
,p.nom_perfil
,m.idmenu
,m.nom_menu
from
acesso_menu as m
,acesso_perfil_menu as pm
,acesso_perfil as p
,acesso_perfil_user as pu
,acesso_user as u
where 
m.idmenu = pm.idmenu
and pm.idperfil = p.idperfil
and pm.idperfil = pu.idperfiluser
and pu.iduser = u.iduser;


Regras e vendo o resultado

O menu.php

Altere o arquivo de Menu para o exemplo abaixo. O foreach irá incluir cada um do menus o perfil do usuário tem

$userMenu = Acesso::getAcessoUserMenuByLogin();
$menu = new TMenuDhtmlx();
//Gera o menu considerando os registros de banco.
foreach ($userMenu['IDMENU'] as $key => $value){
    $menu->add($userMenu['IDMENU'][$key], $userMenu['IDMENU_PAI'][$key], $userMenu['NOM_MENU'][$key], $userMenu['URL'][$key], $userMenu['TOOLTIP'][$key], $userMenu['IMG_MENU'][$key]);
}
$menu->getXml();

O Acesso.class.php

Agora o Acesso.class.php terá um novo método

public static function getAcessoUserMenuByLogin() {
   $login = $_SESSION[APLICATIVO]['LOGIN'];
   $userMenu = Acesso_menuDAO::selectMenuByLogin($login);
   return $userMenu;
}

Lembrando que no momento de autenticar o usuário gravamos o LOGIN na sessão.

O Acesso_menuDAO.class.php

Vamos incluir o método no arquivo Acesso_menuDAO.class.php. Reparei que usaremos a view acesso_user_menu ela já facilitou a relação entre o login do usuário e os menus que ele pode acessar

	public static function selectMenuByLogin( $login_user )
	{
	    $values = array($login_user);
	    $sql = 'select
				 m.idmenu
				,m.idmenu_pai
				,m.nom_menu
				,m.url
				,m.tooltip
				,m.img_menu
				,m.imgdisabled
				,m.dissabled
				,m.hotkey
				,m.boolseparator
				,m.jsonparams
				,m.sit_ativo
				,m.dat_inclusao
				,m.dat_update
				from acesso_menu as m
					,acesso_user_menu as um
				where um.idmenu = m.idmenu
				AND um.login_user = ?';
	    return self::executeSql($sql, $values);
	} 

Mais sobre o modelo

Nesse modelo de acesso por perfil, se um usuário tiver mais de um perfil os menus serão iguais a união do perfis.

Próxima etapa ?

17 - Grid Avançado