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.