-
Notifications
You must be signed in to change notification settings - Fork 6
Perfis de acesso
Para o perfil de acesso funcionar os pré-requisitos são
- usuário autenticado
- 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.
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.
-- -----------------------------------------------------
-- 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;
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();
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.
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);
}
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.
17 - Grid Avançado
Índice completo - Aprendendo formDin em etapas
Conheça os projetos relacionados ao formDin
- FormDin Last Release - ultima versão estável
- SysGen - Gerador de código para FormDin
- formDocker - Ambiente para o FormDin em Docker
- FormDin5 - FormDin 5 sobre o Adianti FrameWork
- SysGenAd - Gerador de código para FormDin 5 usando o Adianti FrameWork
Aprendendo formDin em etapas
- Baixando o formDin
- Instalado e Configurando Ambiente de Desenvolvimento
- Usando XDebug
- Informações técnicas
- Primeira Aplicação
- Entendendo a primeira aplicação
- Criando Menu Básico
- Conectando com um Banco de Dados
- Usando DAO e VO
- Grid Básico
- Componentes Básicos
- O Formulário
- Relatórios em PDF
- Componentes Avançados
- Autenticando o usuário
- Perfis de acesso
- Grid Avançado
- Conectando com mais um Banco de Dados ao mesmo tempo
- Automatizando a criação de aplicação
- Segurança
- Layout e CSS
- API REST
- Arquitetura do FormDin
- Versões e versionamento
- Usando o Eclipse
- Usando o VS Code
- História do formDin
- Usando PHPUnit para fazer testes unitários
- Usando Composer
- Usando Docker
- Microsoft SQL Server