Blog de Novembro, 2019

O Cronapp agora permite rodar as aplicações geradas pela plataforma em qualquer máquina que disponha da instalação do Docker. Veja como executar em Executar projeto localmente via Docker e Nginx


Arquivo Dockerfile


Nova Permissão de Segurança

O sistema de permissões de segurança é um mecanismo de autenticação e autorização de usuários. Usuários podem fazer login com as informações contidas no Banco de Dados ou podem usar um provedor de login externo. Os provedores de login externo suportados incluem o Active Directory, OpenID-connect, Facebook, Google, Microsoft Account, Twitter, Github, Certificados digitais e ICP Brasil, podendo também ser personalizado para qualquer provedor de login externo compatível com OAuth 2.0. 

Figura 1 - Acesso a nova janela de permissões de segurança

Modelo de dados das permissões de segurança

Por padrão, o sistema de permissões e segurança armazena informações de usuário em um banco de dados usando o JPA. Para muitos aplicativos, essa abordagem funciona bem. No entanto, você pode preferir usar um mecanismo de persistência ou esquema de dados diferente, tornando o modelo extensível e personalizável.


Diagrama de dados

O modelo de dados das permissões de segurança é representado pelo seguinte diagrama de dados:

Figura 2 - Tabelas geradas junto com o sistema

Tipos de Entidade

O modelo de dados das permissões de segurança consiste dos seguintes tipos de entidade (Figura 2):

Nome da Entidade

Descrição

UserRepresenta um usuário
RoleRepresenta um papel 
LoginRepresenta um login e seu provedor para um usuário
SecurableRepresenta um conjunto de objetos ao qual você quer aplicar controle de acesso
ViewRepresenta um objeto do tipo View ao qual você quer aplicar controle de acesso
RoleSecurableAssocia um conjunto de objetos a um papel, permitindo que todos os usuários contidos em um papel tenham acesso a esse conjunto de objetos

UserSecurable

Associa um conjunto de objetos a um usuário, permitindo que o usuário tenha acesso a esse conjunto de objetos
UserRoleAssocia um usuário a um papel

Relacionamentos dos tipos de entidade

Os tipos de entidade são relacionados entre si das seguintes formas:

  • Cada User pode ter múltiplos Securables associados, e cada Securable pode estar associado a múltiplos Users. Esse relacionamento muitos-para-muitos é representado pela entidade UserSecurable.
  • Cada User pode ter múltiplos Logins associados.
  • Cada User pode ter múltiplos Roles associados, e cada Role pode estar associada a múltiplos Users. Esse relacionamento muitos-para-muitos é representado pela entidade UserRole.
  • Cada Role pode ter múltiplos Securables associados, e cada Securable pode estar associado a múltiplos Roles. Esse relacionamento muitos-para-muitos é representado pela entidade RoleSecurable.
  • Cada Securable pode ter múltiplos Views associados.

Personalizando as permissões de segurança

Por padrão, as permissões de segurança podem ser personalizadas durante o desenvolvimento da aplicação e durante a sua execução.

Durante o desenvolvimento, acesse o menu Projeto → Permissão de segurança (Figura 1).


Tela principal do sistema de permissão de segurança

A tela principal do sistema de permissão de segurança é composta das abas (item 1 figura abaixo) de Permissionáveis (Securable), Grupos (Role) e Usuários (User).



Figura 3 - Configuração dos Permissionáveis

Permissionáveis

Mostra os perfis de permissões do projeto, podendo editar ou adicionar novos perfis. Por padrão, o Cronapp cria automaticamente os perfis: Public, Authenticated e Administrators.

Ao editar um dos permissionáveis (figura 3), é possível editar seu nome (aba Geral), adicionar diversas permissões na camada de view  (aba Visões), definir os grupos de usuários que pertencem a esse perfil (aba Grupo) ou selecionar os usuários individualmente (Usuários),

Grupos

As permissões dadas a um Grupos de acesso serão passadas aos usuários que estão vinculados a esse grupo,

Nas configurações de um grupo é possível: alterar o nome, indicar se o grupo pode ter membros e se o grupo é predefinido. Além disso, a aba Usuários (nas configurações do grupo) permite selecionar os usuários para esse grupo.

Por padrão, o Cronapp possui os grupos Administrators (administradores do sistema), Anonymous Users (usuários não logados) e Authenticated Users (usuários logados).

Usuários

Os usuários cadastrados podem receber permissões específicas ou ser adicionado em grupos.



CRONAPP-165

Página a ser modificada:

Referência Cronapp



O Cronapp adicionou dois novos blocos para utilização de queries nativas. São eles: 

Abrir consulta nativa

Este bloco deve ser usado em consultas: SELECT

Figura 1: Bloco Abrir consulta nativa

Abrir instrução SQL nativa

Este bloco deve ser usado quando a instrução SQL for um INSERT, UPDATE ou DELETE.

Figura 2: Bloco Abrir instrução SQL nativa

Ambos os blocos possuem os seguintes parâmetros:

  1. Entidade: Entidade definida e existente no Cronapp.
  2. Consulta SQL: Instrução SQL nativa a ser executada pelo bloco.
  3. Parâmetros para consulta: Os parâmetros presentes na instrução SQL deve possuir dois-pontos (caractere :) antes de qualquer palavra, sendo este parâmetro opcional. Ex. :unidade

CRONAPP-1020

Página a ser modificada:

Database

Um novo mecanismo de customização de templates foi adicionado à árvore de recursos. Trata-se do item Arquivos de Template. Esses arquivos são todos os templates que o Cronapp usa para gerar arquivos, camadas de dados e CRUDs. Ao abrir um arquivo e modificá-lo, você estará customizando um determinado template e o Cronapp passará usar ele ao invés do padrão de fábrica. O novo item aparece conforme imagem abaixo: 


Figura 1 - Arquivos usados para customização de templates


Para customizar a forma como Cronapp gera os formulários de CRUD, duplique a pasta Arquivos de Template/files/crud/angular_crud_view e depois insira um novo nome ao template, editando o arquivo templates.properties. Veja as imagens abaixo:


Figura 2 - Edição das propriedades do Templates


No exemplo acima, o template do CRUD fica no arquivo __FileName__.view.ftl. Esse arquivo segue um padrão do FreeMarker para definição de templates. Veja imagem a baixo:


Figura 3 - Arquivo do template do CRUD


Os arquivos de template ficam com uma cor diferente dos demais. A cor laranja significa que o template está com o padrão de fábrica e a branca, que ele foi customizado. Para voltar alguma parte ao padrão de fábrica, basta excluir o arquivo ou pasta customizada. Para voltar todo o conteúdo para o padrão de fábrica, exclua a pasta Arquivos de Template.

Existem duas subpastas entro de Arquivos do template, são elas

  • files: onde ficam os templates de arquivos gerais como formulários, cruds, etc e
  • data-layer: armazena os templates de geração dos arquivos java da camada de dados.


O Cronapp disponibilizou um plugin que permite exportar métricas da aplicação para serem usadas por serviços de terceiros, como o Prometheus por exemplo. 

Para usar esta funcionalidade, basta abrir um projeto e ir no Menu Plugin → Adicionar novo plugin.

Figura 1 - Opção Adicionar novo Plugin


Com a janela de listagens de Plugins aberta, selecione a opção General e clique em Avançar.

Figura 2 - Janela de Categorias de Plugins


Na tela a seguir, procure pelo plugin Cronapp APM (ou digite o termo na barra de pesquisa e aperte enter), selecione o plugin e clique em Avançar e logo em seguida em Finalizar.

Figura 3 - Plugin Cronapp APM


O plugin será instalado e será exibida uma janela informando das alterações causadas pelo plugin ao projeto.


Figura 4 - Sumário de alterações


Após a instalação do plugin, é necessário acessar a  opção de Permissão de segurança do projeto e dar permissão à URL de acesso do plugin, que fica no endereço /actuator (recomenda-se inicialmente configurar a permissão authenticated). 

Figura 5 - Permissão de acesso a URL de métricas


Com a permissão devidamente configurada, basta rodar o projeto e acessar o endereço <URL do projeto>/actuator (Ex.: https://app-14-174-27917.ide.cronapp.io).

Figura 6 - Tela de métricas e links para métricas mais específicas


O Cronapp disponibilizou mais um novo evento "Ao Gerar Erro" (On Error) nas fontes de dados, cujo o objetivo é tratamento de erros de qualquer natureza durante o processo de manipulação de dados de uma Fonte de Dados. 

O novo evento entra na lista na aba de eventos, conforme a figura abaixo:


Depois de escolhido um bloco, qualquer erro gerado na manipulação da fonte de dados será enviado para esse bloco. Caso o desenvolvedor queria manipular o erro e enviar um outro, basta lançar um nova exceção. Veja o exemplo abaixo:


O evento pode receber os seguintes argumentos:

  • primaryKey: primeira chave primária da fonte;
  • primaryKeys: lista com todas as chaves primárias da fonte;
  • entityName: nome da entidade;
  • eventName: nome do evento (onError);
  • data: objeto da entidade manipulado; 
  • exception: objeto da exceção;
  • exceptionMessage: mensagem da exceção;


Autenticação via Single Sign-On

Para utilizar a nova opção de autenticação via Single Sign-On, basta selecionar a opção SSO no combo de Tipo de Autenticação que aparece na segunda página ao criar um novo projeto. 


Figura 1 - Opção SSO no combo de Tipos de Autenticação

Figura 1 - Opção SSO no combo de Tipos de Autenticação.


Com o projeto já criado, localize o arquivo application.properties no projeto, navegando nas pastas src/main/resources e abra o arquivo clicando duas vezes sobre ele.


Figura 2 - Arquivo application.properties na árvore de arquivos.


Ao executar o passo anterior, será aberta uma tela para preenchimento de alguns campos necessários para o funcionamento da autenticação via Single Sign-On.


Figura 3 - Janela de Configurações do Projeto

Abaixo estão os campos da janela Configurações do Projeto

  • ID do Cliente: O ID do cliente encontrado nas configurações do provedor de autenticação SSO.
  • Segredo do Cliente: O segredo do cliente encontrado nas configurações do provedor de autenticação SSO.
  • URI do Token de Acesso: URI do provedor OAuth que fornece o token de acesso para a aplicação.
  • URI de Autorização do Usuário: URI para o qual o usuário será redirecionado, se for necessário, para autorizar o acesso ao recurso.
  • URI de Informações do Usuário: URI para obter detalhes atuais do usuário.


O Cronapp liberou o suporte a campos do tipo rowversion (Versão) que trata edições concorrentes de um mesmo registro. 

ROWVERSION é um tipo de dados que expõe números binários exclusivos, gerados automaticamente, em um banco de dados. Rowversion geralmente é usado como um mecanismo de registro de versão para linhas de tabela. O tamanho de armazenamento é de 8 bytes. O tipo de dados rowversion é apenas um número que aumenta e não preserva uma data nem hora. 

Nas opções de campos de uma entidade, temos um novo tipo chamado Versão. Veja a figura abaixo:

Figura 1 - Novo tipo "Versão"


Após escolhido o tipo Versão (como na figura acima), o Cronapp vai tratar a edição concorrente dessa entidade. Um registro (formulário) não poderá ser modificado caso ele já tenha sido modificado por outro meio após o início da edição atual. Exemplo: uma pessoa inicia a edição de um registro de um cadastro e, ao mesmo tempo, outra pessoa também inicia a edição desse mesmo registro. Apenas quem salvar primeiro terá sucesso e o outro receberá uma mensagem de erro informando que o registro foi modificado por outro usuário.

Observação: o cache de consultas, ao gerar a camada de persistência no diagrama de dados, deve ser desativado para que o suporte a ROWVERSION funcione corretamente. Veja a figura 2:


Figura 2 - Sempre desative o cache de consulta ao usar o tipo versão



CRONAPP-935

Página a ser modificada

Diagrama


Suporte a Versionamento de Entidades

Implementada nova opção no diagrama para marcar Coluna de Versão, gerando entidades com uma coluna para versionamento.  


Figura 1: Coluna de Versão

Requisitos para a coluna de versão:

  1. Não pode ser Chave.
  2. Deve possuir um dos seguintes tipos: Inteiro, Inteiro Longo, ou Data e Hora com Fuso.
  3. Deve permitir Nulo e Inserção.

Entidades com uma Coluna de Versão marcada apresentam os seguintes comportamentos:

  1. A inserção/incremento ocorrem de forma automática da coluna.
  2. A atualização de um ou mais campos de um registro é bloqueada, exceto quando o número da versão permanece inalterado. Neste caso, o campo utilizado para versionamento é incrementado automaticamente.

Exemplo de Entidade "Empresa" com coluna de versionamento:

Figura 2: Entidade com Coluna de Versão gerada automaticamente.

Figura 3: Mensagem de erro ao tentar atualizar o registro passando uma versão diferente.



CRONAPP-935

Página a ser alterada:

Diagrama

Uma nova opção foi disponibilizada para os usuários do Cronapp em que um bloco pode ser disponibilizado externamente através de um WebService SOAP. 

Para isso, uma nova opção foi disponibilizada nas configurações de bloco. Veja a imagem a seguir: 


Ao marcar a opção, o bloco estará listado no serviços expostos pela aplicação, através do endereço https://<url da aplicação>/services/. Ao acessar esse endereço, os serviços são listados como na imagem abaixo:


Clicando no link do serviço, é possível ver o WSDL do serviço e importá-lo em alguma outra aplicação. 

Observação: assim como um WebService REST, as permissões de segurança afetam diretamente o serviço. Um WebService  SOAP é trafegado via POST, logo a permissão "Permite Inserir" é a que deve ser usada para ele. 




CRONAPP-974

Página a ser modificada:


Para utilizar o componente Árvore, basta arrastar o mesmo para dentro de uma view web. 


Figura 1 - Botão e componente na tela de edição visual web


Após adicionar à view, a janela de opções do componente será aberta.


Figura 2 - Janela de configurações da Treeview


Abaixo estão os campos da janela Opções da Árvore:

  • Fonte de dados: Selecionar/Adicionar uma Fonte de dados.
  • Campo de texto: Informar qual o campo que deverá ser utilizado para exibir o texto.
  • Campo de auto relacionamento: Informar qual o campo de auto relacionamento.
  • Obter valor do campo como: Selecionar como deve ser obtido o valor do campo.
    • Esse campo permite obter o valor como Objeto ou Chaves.


Figura 3 - Resultado da Árvore após configuração



CRONAPP-932

Página a ser modificada:

  

Agora é possível inserir, de forma low-code, imagens no componente visual Cartão, permitindo ainda mais sua personalização. 

Figura 1 - Seleção de imagem no componente "Cartão"