Aparentemente o módulo de segurança não funciona

Prezados,

Apliquei o módulo de segurança por grupo no meu projeto, porém, criar usuários, os grupos, dar permissão para cada grupo fazer as ações (via grid no Grupo/Aplicações), e após compilar tudo no projeto local não funciona, ou seja, nenhum bloqueio é feito, continua tudo liberado para todos os usuários e grupos. Após jogar na produção também segue do mesmo modo.

Existe alguma dica, opção ou algo que eu esteja esquecendo que deve ser feito para que o módulo possa funcionar corretamente?

Obrigado,

tens q ativar a segurança em cada uma das aplicações.
e configurar corretamente.

Opa… se você estiver se referindo ao ambiente de desenvolvimento é assim mesmo; depois que você publica e acessa direto o ambiente de produção, funciona certinho. (passei por isso qdo estava começando).

1 Curtida

Olá Clarck e Anderson,

Eu vou testar então, vou habilitar a segurança de todos os módulos, compilar e publicar. Vamos ver.

Valeu.

Para aplicar a segurança nas aplicações em lote:

Menu;
Ferramentas;
Edição Expressa de Aplicações;
Selecionar as aplicações desejadas;
Usar Segurança.

Obvio se não souber disso.

geralmente, dependendo das configurações do sc, acessar uma app em local(desenvolvimento)
vai ser permitido, diferentemente da produção onde é primeiro observado as permissões de acesso do usuario
conforme é cedido no registro do mesmo, juntamente à segurança da app definida na área de segurança individual dessa.

blz?

Pois é parece fácil, mas quando funciona.

Eu publiquei com a segurança ativada porém todas as aplicações aparece como “Usuário não autorizado”.

Fiz um teste, publiquei sem a segurança até onde eu consigo ir na sincronização das aplicações, porém apresenta erro.

Não sei o que fazer.

Em produção, na segurança, você tem que liberar as aplicações para o usuário desejado, senão essa mensagem é exibida mesmo.

Não funcionou.

Coloquei segurança nas aplicações, em produção apliquei os acessos nos grupos.
Tentei sincronizar para ver se faltava isso, mas aparece 0 sincronizadas.

E não funcionou.

Depois de sincronizar as aplicações vc precisa libera-las no grupo x aplicações.

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.

ilanocf

É bem interessante sua proposta, porém, meio complexa. Para mim um esquema de login que habilita os itens do menu de acordo com o grupo já estaria bom.

O módulo de segurança no meu caso não está funcionando, fiz de tudo, já faz um bom tempo que estou trabalhando com o SC, sei que estou falando.

Abs

A sugestão mantém insegura toda a questão de acessos as aplicações pois exige que estas estejam sem segurança habilitada e apenas escondem do menu as que não devem ser acessadas.
Nada contra um módulo de segurança próprio, eu mesmo desenvolvi o meu. Mas deve-se assegurar a segurança quando ao acesso direto as aplicações ou ao manuseio de variáveis em sessão maliciosos dando pleno acesso a usuários indesejados.
Por isso sugiro a habilitação da segurança em todas aplicações excluindo o login e uso da macro:

https://www.scriptcase.com.br/docs/pt_br/v81/macros-scriptcase/macros-scriptcase.htm#sc_apl_status

para sua devida e correta liberação para acesso.

1 Curtida

Huuummmm!!! Valeu Haroldo, vou fazer testes e melhorar minhas aplicações.

Haroldo e ilanocf

Vocês poderiam colocar um exemplo básico aqui com login e as macros para que eu possa seguir no caminho das pedras…

abs

Crie um projeto.
Instale o módulo de segurança do SC.
Estude a aplicação de Login.

1 Curtida

Nesse caso, no ambiente de desenvolvimento também tem bugs de não abrir o menu do admin após acessar com usuários de outro tipo de conta?

Aprendi muita coisa no canal do SC do youtube. Tem um vídeo bom que fala do módulo de segurança: https://www.youtube.com/watch?v=MrkbRbKfvP4