segunda-feira, 27 de julho de 2015

Could not load file or assembly 'Jayrock-JSON...'

Could not load file or assembly 'Jayrock-JSON, Version=0.9.7507.0, Culture=neutral, PublicKeyToken=6f5bf81c27b6b8aa' or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))



Fazia um tempinho que não aparecia uma mensagenzinha indecifrável na minha vida, ou seja, que excelente noticia. Mas para contrariar a maré, apareceu uma das boas.  Como resolvi? apaguei tudo que estava na pasta:


C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files



segunda-feira, 6 de julho de 2015

Programando a API do GAM

GAM (Genexus Access Manager) é um recurso fantástico para proteger nossas aplicações Web e Smartdevice, principalmente porque não é necessário muito esforço de desenvolvimento para imediatamente usufruir de modelos interessantes de autenticação e também de autorização, em outras palavras, proteção de acesso aos objetos do sistema. Bastando para isso aplicar true a propriedade Enable Integrated Security. Com isso todos os objetos do sistema imediatamente passam a ser protegidos no protocolo OAUTH, o mesmo utilizado por Facebook, Google, Twitter, entre outros.

Uma vez aplicado resta ao desenvolvedor apenas gerenciar o relacionamento entre o sistema propriamente dito com o sistema de segurança, que é feito mediante a programação dos recursos disponibilizados na chamada API (Aplication Programming Interface), que é automaticamente incluída na pasta GAM_Library. Esta programação não é muito complicada, ao contrário, os recursos são acessados de forma bem intuitiva.

Então fica a pergunta, se tudo é tão interessante e simples por onde começo?

O GAM pode ser aplicado sobre um sistema já pronto e em produção ou pode ainda ser modelado juntamente com o próprio projeto em construção. Além da definição do nível de proteção (Authentication=controle sobre login, e Authorization=controle sobre o acesso aos objetos), que é definido por um único item de configuração, em seguida temos que ajustar os perfis que terão acesso ao sistema (Role), usuários (User) e as permissões (Permission) desses perfis aos objetos do sistema.  Em resumo seria só isso a ser feito, mas o principal problema é que essas ações normalmente são realizadas na própria interface fornecida junto com o GAM ao seu projeto que ficam instaladas no GAM_Examples.

Para facilitar um pouco a vida do desenvolvedor o GAM inclui por padrão um usuário admin (senha admin123), com acesso permitido (Allow) a todos os objetos. Mas outros usuários e perfis podem ser criados para representar a realidade ao ser publicado na produção.

Apesar de todos os benefícios, temos um pequeno probleminha ao aplicar o GAM no modo Authorization em nossa kb, que é exatamente a definição dos privilégios dos objetos aos perfis. Essa ação não é simples de ser realizada nos programas oferecidos e também é um modelo muito manual.  E também, se por algum acaso você tiver que reconstruir as tabelas do GAM, as definições anteriormente geradas serão perdidas.  Sendo assim, vamos utilizar este artigo para programar um pouco a API do GAM para gerar um carregador de privilégios.

Construindo um Carregador de Privilégios

Gostei desse titulo, rs, parece coisa de eletrônica, mas vamos ao que interessa. Primeiramente entender um pouquinho da API do GAM, que é composta por um conjunto de External Objects, que apontam para objetos nativos em .Net ou Java.


A partir desses objetos podemos acessar e definir informações no GAM, como por exemplo, criar usuários, definir privilégios, entre outras coisas, bastando selecionar a 'Classe' correta.   Por exemplo para operarmos sobre um usuário podemos recorrer ao External Object GAMUser, que possui os métodos necessários para realizar a operação, como a troca de uma senha, por exemplo.


Para iniciarmos a discussão, primeiramente precisamos compreender um pouco a relação entre as classes definidas nesses External Objects.  O GAMRepository compreende o primeiro nível da hierarquia de classes, e este possui um método GetApplication que devolve a coleção de aplicações (kbs) que estão sendo gerenciadas.  Cada GAMApplication possui um conjunto de GAMRole's que pode ser obtida pelo método GetRoles.


Desta forma GAMRepository => GAMApplication =>  GAMRole gera a sequencia de classes necessária para se obter ou se definir as permissões do perfil (GAMRole)

Para definir as permissões do perfil temos um método GetUnassignedPermissions que retorna os objetos que ainda não foram designados na permissão do perfil.

Para simplificar um pouco e lhe dar uma visão geral sobre essas classes, vamos programar um recurso simples que executa a operação de definição dos privilégios montado a seguir tem a seguinte lógica:

  1. Percorrer todas as aplicações do repositório
  2. E para cada aplicação
  3. Pegar todos os perfis
  4. Pegar as permissoes que ainda não foram atribuídos
  5. Atribuir para o perfil

Meio estranho, mas entenda como um exemplo 'generico' para você mesmo começar a gerar sua própria programação do GAM.


Abaixo apresentamos o programa completo.

Event 'Carga'

 /* 1) APPLICATION */
 for &GAMApplication in GAMRepository.GetApplications(
                           &GAMApplicationFilter, &GAMErrors)

     /* 2) ROLES */
  for &GAMRole in &GAMApplication.GetRoles(&GAMErrors)

     /* 3) PERMISSION NAO ATRIBUIDAS*/
     for &GAMPermission in &GAMRole.GetUnassignedPermissions(
         &GAMPermissionFilter, &GAMErrors)
     /* 4) ATRIBUI NOVA PERMISSION AO ROLE */
 &NEWGAMPermission.ApplicationId = 1
&NEWGAMPermission.GUID = &GAMPermission.GUID
&NEWGAMPermission.Type = GAMPermissionAccessType.Allow
&OK = &GAMRole.AddPermission(&NEWGAMPermission, &GAMErrors)

if &OK
   commit
else
   for &GAMError in &GAMErrors
    msg(Format(!"%1 (GAM%2)", &gamerror.Message,
   endfor
endif
     endfor
   endfor
  endfor
Endevent

O GetApplications executa  operação de recuperar do repositório todas as aplicações (kbs).
  GAMRepository.GetApplications(&GAMApplicationFilter,&GAMErrors)

Em seguida temos a recuperação dos perfis definidos na aplicação.
  &GAMApplication.GetRoles(&GAMErrors)

E para o perfil recuperado temos o método que devolve todas as permissões que não foram atribuídas.
  &GAMRole.GetUnassignedPermissions(&GAMPermissionFilter,&GAMErrors)

Para finalmente ser atribuida ao perfil com:
   &GAMRole.AddPermission(&NEWGAMPermission, &GAMErrors)

As variáveis criadas seguem o mesmo padrão dos nomes dos objetos, mas para facilitar apresentamos a lista a seguir.
Enfim, para ajustar a sua necessidade você precisaria identificar, por exemplo o perfil e o objeto a ser atribuído. Não é complicado porque tanto o GAMRole quanto o GAMPermission possui a propriedade Name que pode ser utilizado para recuperar o nome da função e do programa, mas muito cuidado com os elementos obrigatórios na designação da permissão, que devem sempre ser fornecidos, que são.

&NEWGAMPermission.ApplicationId = 1
&NEWGAMPermission.GUID = &GAMPermission.GUID
&NEWGAMPermission.Type  = GAMPermissionAccessType.Allow

E mais um detalhe, se as tabelas do GAM forem recriadas os valores de GUID são completamente alterados, e será necessário executar o programa de carga de privilégios novamente.

Enfim, um excelente recurso para proteger seus sistemas, e um estilo de programação também interessante.
Boa programação!