Gente, é o seguinte. Eu não usei a segurança do SC não. Optei por fazer da seguinte maneira:
Crie as tabelas:
CREATE TABLE `B001_PERFIS` (
`ID` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`NOME` VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
`ABAINICIAL` VARCHAR(50) COLLATE utf8_general_ci NOT NULL,
`DESBLOQUEIA` INTEGER(11) NOT NULL DEFAULT 0,
PRIMARY KEY USING BTREE (`ID`),
UNIQUE KEY `NOMEPERFIL` USING BTREE (`NOME`)
) ENGINE=InnoDB;
CREATE TABLE B002_USUARIOS
(
ID
INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
IDCOLIGADA
INTEGER(10) UNSIGNED NOT NULL,
IDPERFFIL
INTEGER(10) UNSIGNED NOT NULL,
IDPESSOA
INTEGER(10) UNSIGNED DEFAULT NULL,
NOME
VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
LOGIN
VARCHAR(50) COLLATE utf8_general_ci NOT NULL,
SENHA
VARCHAR(80) COLLATE utf8_general_ci NOT NULL,
EMAIL
VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
ATIVO
INTEGER(10) NOT NULL,
AVATAR
BLOB,
ALTERARSENHA
INTEGER(11) NOT NULL DEFAULT 0,
PRIMARY KEY USING BTREE (ID
),
UNIQUE KEY PERFILUSUARIO
USING BTREE (IDCOLIGADA
, IDPERFFIL
, EMAIL
),
KEY IDPERFIL
USING BTREE (IDPERFFIL
),
CONSTRAINT B002_USUARIOS_ibfk_1
FOREIGN KEY (IDPERFFIL
) REFERENCES B001_PERFIS
(ID
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
CREATE TABLE B003_ARQUIVOS
(
ID
INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
NOME
VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY USING BTREE (ID
),
UNIQUE KEY NOMEARQUIVO
USING BTREE (NOME
)
) ENGINE=InnoDB;
CREATE TABLE B004_MODULOS
(
ID
INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
IDARQUIVO
INTEGER(10) UNSIGNED DEFAULT NULL,
TIPO
INTEGER(10) UNSIGNED DEFAULT NULL COMMENT ‘1 = AUXILIARES; 2 = CADASTROS; 3 = CONSULTAS; 4 = RELATÓRIOS; 5 = UTILITÁRIOS’,
NOME
VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
ORDEM
INTEGER(10) UNSIGNED NOT NULL,
ITEMMENU
INTEGER(10) UNSIGNED NOT NULL,
ICONE
BLOB,
NOMEIMAGEM
VARCHAR(80) COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY USING BTREE (ID
)
) ENGINE=InnoDB;
CREATE TABLE B005_PERMISSOES
(
ID
INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
IDMODULO
INTEGER(10) UNSIGNED NOT NULL,
IDPERFIL
INTEGER(10) UNSIGNED NOT NULL,
TIPO
INTEGER(10) UNSIGNED DEFAULT NULL,
INCLUIR
INTEGER(10) UNSIGNED DEFAULT 0,
ALTERAR
INTEGER(10) UNSIGNED DEFAULT 0,
EXCLUIR
INTEGER(10) UNSIGNED DEFAULT 0,
FILTRAR
INTEGER(10) UNSIGNED DEFAULT 0,
EXPORTAR
INTEGER(10) UNSIGNED DEFAULT 0,
ATIVAR
INTEGER(10) UNSIGNED DEFAULT NULL,
ORDEM
INTEGER(10) UNSIGNED NOT NULL,
PRIMARY KEY USING BTREE (ID
),
UNIQUE KEY PERFILPERMISSAO
USING BTREE (TIPO
, IDMODULO
, IDPERFIL
),
KEY B005_PERMISSOES_FKIndex1
USING BTREE (IDPERFIL
),
KEY B005_PERMISSOES_FKIndex2
USING BTREE (IDMODULO
),
CONSTRAINT B005_PERMISSOES_ibfk_1
FOREIGN KEY (IDPERFIL
) REFERENCES B001_PERFIS
(ID
) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT B005_PERMISSOES_ibfk_2
FOREIGN KEY (IDMODULO
) REFERENCES B004_MODULOS
(ID
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
Depois criei a biblioteca abaixo do tipo Projeto (validarPermissao.php) para ser usada em todas as aplicações, exceto aquelas que serão de domínio público. As linhas que estão comentadas é porque ainda estão em modo de desenvolvimento, quando for pra produção removo os comentários das linhas de comando.
/*
[size=10pt][b]Modo de uso:[/b][/size]
1. Vá na aplicação;
2. Vá na aba Programação;
3. Clique em Bibliotecas Internas;
4. Selecione a opção com o nome validarPermissao.php;
5. Vá na aba Formulário;
6. Clique na pasta Eventos;
7. Inclua a linha [b]validaaplicacao();[/b] nos eventos [b]OnLoad[/b] de controles e formulários e [b]OnHeader[/b] de consultas;
8. Salve a aplicação.
[i]***** Sempre que alterar esta biblioteca, você precisará gerar novamente o código fonte de todas as aplicações que fizerem a chamada desta.
***** As linhas em vermelho, são para registrar no banco os nomes das aplicações que serão abertas em fase de teste. Assim, não precisarei cadastrar os nomes manualmente e nos módulos apenas seto cada aplicação e dou um nome para ser apresentado no menu. As linhas seguintes já fazem os testes do perfil.[/i]
*/
function VerificaPerfil()
{
$codusuario = [vlUsuario];
$sql = "SELECT ID, LOGIN, ATIVO FROM B002_USUARIOS
WHERE ID = $codusuario";
sc_lookup(Ds, $sql);
if(!empty({Ds}))
{
if({Ds[0][2]} == 0)
{
sc_redir(login);
}
} else
if(empty({Ds}))
{
sc_redir(login);
};
};
function validaaplicacao()
{
/*$arquivo = explode(DIRECTORY_SEPARATOR, __FILE__);
$nome = end($arquivo);*/
$nomeapl = $this->Ini->nm_cod_apl;
$titulo = $this->Ini->nm_nome_apl;
$perfil = [vlPerfil];
VerificaPerfil();
$sql = "SELECT NOME FROM B003_ARQUIVOS WHERE NOME = '$nomeapl';";
$cmd = "INSERT INTO B003_ARQUIVOS (NOME) VALUES ('$nomeapl');";
sc_lookup(dsDados, $sql);
if(empty({dsDados}))
{
sc_exec_sql($cmd);
};
$sql2 = "SELECT C.NOME,
A.INCLUIR, A.ALTERAR,
A.EXCLUIR, A.FILTRAR, A.EXPORTAR, A.ATIVAR, A.ORDEM
FROM B005_PERMISSOES A
INNER JOIN B004_MODULOS B ON (B.ID = A.IDMODULO)
INNER JOIN B003_ARQUIVOS C ON (C.ID = B.IDARQUIVO)
WHERE C.NOME = '$nomeapl'
AND A.IDPERFIL = $perfil;";
sc_lookup(dsDados2, $sql2);
if(!empty({dsDados2}))
{
/* DESCOMENTAR A LINHA ABAIXO QUANDO FINALIZAR O PROJETO. TEM OUTRA LINHA DESSA NO FINAL DO CÓDIGO */
/*if({dsDados2[0][6]} = 0) {sc_redir(acessonegado, pagina=$nomeapl);};*/
if({dsDados2[0][1]} = 1) {sc_btn_display ('new','on');} else {sc_btn_display ('new','off');};
if({dsDados2[0][1]} = 1) {sc_btn_display ('BtnNovo','on');} else {sc_btn_display ('BtnNovo','off');};
if({dsDados2[0][1]} = 1) {sc_btn_display ('BtnSalvar','on');} else {sc_btn_display ('BtnSalvar','off');};
if({dsDados2[0][1]} = 1) {sc_btn_display ('BtnAlterar','on');} else {sc_btn_display ('BtnAlterar','off');};
if({dsDados2[0][1]} = 1) {sc_btn_display ('insert','on');} else {sc_btn_display ('insert','off');};
if({dsDados2[0][2]} = 1) {sc_btn_display ('update','on');} else {sc_btn_display ('update','off');};
if({dsDados2[0][3]} = 1) {sc_btn_display ('delete','on');} else {sc_btn_display ('delete','off');};
if({dsDados2[0][3]} = 1) {sc_btn_display ('ok','on');} else {sc_btn_display ('ok','off');};
if({dsDados2[0][3]} = 1) {sc_btn_display ('BtnExecutarSQL','on');} else {sc_btn_display ('BtnExecutarSQL','off');};
if({dsDados2[0][3]} = 1) {sc_btn_display ('BtnDesbloqueia','on');} else {sc_btn_display ('BtnDesbloqueia','off');};
if({dsDados2[0][4]} = 1) {
sc_btn_display ('filter','on');
sc_btn_display ('dynsearch','on');
sc_btn_display ('qsearch','on');
} else
{
sc_btn_display ('filter','off');
sc_btn_display ('dynsearch','off');
sc_btn_display ('qsearch','off');
};
if({dsDados2[0][5]} = 1) {
sc_btn_display ('filter','on');
sc_btn_display ('print','on');
sc_btn_display ('pdf','on');
sc_btn_display ('det_pdf','on');
sc_btn_display ('xls','on');
sc_btn_display ('xml','on');
sc_btn_display ('cvs','on');
sc_btn_display ('rtf','on');
sc_btn_display ('word','on');
sc_btn_display ('summary','on');
sc_btn_display ('BtnImprimir','on');
} else
{
sc_btn_display ('filter','off');
sc_btn_display ('print','off');
sc_btn_display ('pdf','off');
sc_btn_display ('det_pdf','off');
sc_btn_display ('xls','off');
sc_btn_display ('xml','off');
sc_btn_display ('cvs','off');
sc_btn_display ('rtf','off');
sc_btn_display ('word','off');
sc_btn_display ('summary','off');
sc_btn_display ('BtnImprimir','off');
};
} else
if(empty({dsDados2}))
{
sc_btn_display ('new','off');
sc_btn_display ('BnNovo','off');
sc_btn_display ('BnSalvar','off');
sc_btn_display ('insert','off');
sc_btn_display ('ok','off');
sc_btn_display ('BtnExecutarSQL','off');
sc_btn_display ('BtnAlterar','off');
sc_btn_display ('update','off');
sc_btn_display ('delete','off');
sc_btn_display ('filter','off');
sc_btn_display ('dynsearch','off');
sc_btn_display ('qsearch','off');
sc_btn_display ('filter','off');
sc_btn_display ('print','off');
sc_btn_display ('pdf','off');
sc_btn_display ('det_pdf','off');
sc_btn_display ('xls','off');
sc_btn_display ('xml','off');
sc_btn_display ('cvs','off');
sc_btn_display ('rtf','off');
sc_btn_display ('word','off');
sc_btn_display ('summary','off');
sc_btn_display ('BtnImprimir','off');
sc_btn_display ('BtnDesbloqueia','off');
sc_btn_display ('facebook','off');
sc_btn_display ('twitter','off');
sc_btn_display ('google','off');
sc_btn_display ('paypal','off');
sc_btn_display ('first','off');
sc_btn_display ('back','off');
sc_btn_display ('forward','off');
sc_btn_display ('last','off');
/* DESCOMENTAR A LINHA ABAIXO APÓS CONCLUIR O PROJETO */
/*sc_redir(acessonegado, pagina=$nomeapl);*/
};
};
E, finalmente, na aplicação de menu, no evento OnLoad:
sc_appmenu_reset(menu);
sc_appmenu_create(menu);
$perfil = [vlPerfil];
$i = -1;
$sql1 = "SELECT ID, CONCAT(’’, UPPER(NOME), ‘’) AS NOME, ICONE,
CASE WHEN NOMEIMAGEM IS NOT NULL THEN
CONCAT(’…/lib/img/sys__NM__bg__NM_’, NOMEIMAGEM) ELSE ‘’ END AS IMAGEM
FROM B004_MODULOS
WHERE TIPO IS NULL AND (IDARQUIVO IS NULL OR IDARQUIVO = 0)
AND ID IN (SELECT DISTINCT TIPO
FROM B005_PERMISSOES
WHERE IDPERFIL = $perfil AND ATIVAR = 1)
ORDER BY TIPO, ORDEM; ";
sc_lookup(dsmodulos, $sql1);
sc_appmenu_add_item(‘menu’,‘item_0’, ‘INÍCIO’,’’,catid=‘0’;catname=‘inicio’, , , );
foreach({dsmodulos} as $arr_modulo)
{
$i = $i + 1;
$icone1 = base64_encode({dsmodulos[0][2]});
$img1 = {dsmodulos[0][3]};
sc_appmenu_add_item('menu','item_'.$arr_modulo[0],, $arr_modulo[1],'',catid=$arr_modulo[0];catname=$arr_modulo[1], $icone1, , );
$sql2 = "SELECT A.ID, B.NOME, C.NOME, A.IDPERFIL, A.IDMODULO, B.ICONE,
CASE WHEN B.NOMEIMAGEM IS NOT NULL THEN
CONCAT('../_lib/img/sys__NM__bg__NM__', B.NOMEIMAGEM) ELSE '' END AS IMAGEM
FROM B005_PERMISSOES A
INNER JOIN B004_MODULOS B ON (B.ID = A.IDMODULO)
INNER JOIN B003_ARQUIVOS C ON (C.ID = B.IDARQUIVO)
WHERE B.TIPO = ".$arr_modulo[0]." AND B.ITEMMENU = 1
AND A.IDPERFIL = $perfil AND A.ATIVAR = 1
ORDER BY B.TIPO, B.ORDEM; ";
sc_lookup(dspermissao,$sql2);
[i]/* A única coisa que não está funcionando neste código é a exibição da imagem no menu. */[/i]
if(!empty({dspermissao}))
foreach({dspermissao} as $arr_permissao)
{
$icone2 = base64_encode({dspermissao[0][5]});
$img2 = {dspermissao[0][6]};
sc_appmenu_add_item('menu',
'item_'.$arr_modulo[0].$arr_permissao[0],
'item_'.$arr_modulo[0],
$arr_permissao[1],
$arr_permissao[2],
prodid=$arr_permissao[0],
"$icone2", "", "");
};
};
$i=$i + 1;
sc_appmenu_add_item(‘menu’, $i, ‘’, ‘SAIR’, ‘deslogar’, ‘’, ‘’, ‘’, ‘_parent’);
Pode melhorar? Com certeza! E, sinceramente, espero que a partir desse modelo a galera aqui possa dar um retorno de como é possível melhorar mais rrrrsssss… Bom, essa foi a saída que encontrei pra fugir do padrão SC. Não sei o que acharão da ideia, mas pra mim está funcionando.
Espero ter ajudado e contribuído para uma ideia maior.