Como adaptar o método onLogin Saudações! Estou criando uma aplicação que usa login baseado em API rest. Funciona dessa forma: minha aplicação faz uma request POST com os dados do formulário de login para a minha API, e esta valida os dados baseando-se nos registros de um banco de dados. Caso os dados estejam corretos, a API devolve um token de acesso. O problema é que o método onLogin é muito amarrado a estrut...
R
Como adaptar o método onLogin  
Saudações!

Estou criando uma aplicação que usa login baseado em API rest. Funciona dessa forma: minha aplicação faz uma request POST com os dados do formulário de login para a minha API, e esta valida os dados baseando-se nos registros de um banco de dados. Caso os dados estejam corretos, a API devolve um token de acesso.

O problema é que o método onLogin é muito amarrado a estrutura do adianti, dificultando a adaptação para nossa necessidade.
Alguém teria alguma ideia de como posso estar adaptando o login baseado na API, e não mais no banco local?

Segue o código que estamos utilizando e está dando erro:

 
  1. <?php
  2. class LoginForm extends TPage
  3. {
  4. protected $form; // form
  5. /**
  6. * Class constructor
  7. * Creates the page and the registration form
  8. */
  9. function __construct($param)
  10. {
  11. parent::__construct();
  12. //$ini = AdiantiApplicationConfig::get();
  13. $this->style = 'clear:both';
  14. // creates the form
  15. $this->form = new BootstrapFormBuilder('LoginForm');
  16. // create the form fields
  17. $login = new TEntry('cpfbene'); //o login refere-se ao CPF do Beneficiário
  18. $password = new TEntry('dtnasc');
  19. // $password = new TDate('dtnasc'); //o password refere-se a Data de nascimento do beneficiário
  20. // define the sizes
  21. $login->setSize('70%', 40);
  22. $password->setSize('70%', 40);
  23. $login->style = 'height:35px; font-size:14px;float:left;border-bottom-left-radius: 0;border-top-left-radius: 0;';
  24. $password->style = 'height:35px;font-size:14px;float:left;border-bottom-left-radius: 0;border-top-left-radius: 0;';
  25. //$login->setMask('999.999.999-99', true);
  26. // $password->setMask('dd/mm/yyyy');
  27. $login->placeholder = ('CPF');
  28. $password->placeholder = ('Data de Nascimento');
  29. $login->autofocus = 'autofocus';
  30. $user = '<span style="float:left;margin-left:44px;height:35px;" class="login-avatar"><i class="glyphicon glyphicon-user"></i></span>';
  31. $locker = '<span style="float:left;margin-left:44px;height:35px;" class="login-avatar"><i class="glyphicon glyphicon-calendar"></i></span>';
  32. $unit = '<span style="float:left;margin-left:44px;height:35px;" class="login-avatar"></span>';
  33. $this->form->addFields( [$user, $login] );
  34. $this->form->addFields([$locker, $password] );
  35. $btn = $this->form->addAction(_t('Log in'), new TAction(array($this, 'auth')), '');
  36. $btn->class = 'btn btn-warning';
  37. $btn->style = 'height: 40px;width: 90%;display: block;margin: auto;font-size:17px;';
  38. $wrapper = new TElement('div');
  39. $wrapper->style = 'margin:auto; margin-top:100px;max-width:460px;';
  40. $wrapper->id = 'login-wrapper';
  41. $wrapper->add($this->form);
  42. // add the form to the page
  43. parent::add($wrapper);
  44. }
  45. /**
  46. * user exit action
  47. * Populate unit combo
  48. */
  49. /* public static function onExitUser($param)
  50. {
  51. try
  52. {
  53. TTransaction::open('permission');
  54. $user = SystemUser::newFromLogin( $param['login'] );
  55. if ($user instanceof SystemUser)
  56. {
  57. $units = $user->getSystemUserUnits();
  58. $options = [];
  59. if ($units)
  60. {
  61. foreach ($units as $unit)
  62. {
  63. $options[$unit->id] = $unit->name;
  64. }
  65. }
  66. TCombo::reload('form_login', 'unit_id', $options);
  67. }
  68. TTransaction::close();
  69. }
  70. catch (Exception $e)
  71. {
  72. new TMessage('error',$e->getMessage());
  73. TTransaction::rollback();
  74. }
  75. }*/
  76. /**
  77. * Authenticate the User
  78. */
  79. public static function auth()
  80. {
  81. $login = $_POST['cpfbene'];
  82. $password = $_POST['dtnasc'];
  83. $request = new HttpRequest();
  84. $request->setUrl('http://192.168.1.94:8000/oauth/token');
  85. $request->setMethod(HTTP_METH_POST);
  86. $request->setQueryData(array(
  87. 'grant_type' => 'password',
  88. 'client_id' => '4',
  89. 'client_secret' => 'nyyLIYE0z3MYco1zOc7t7Twjb8Ijmp25ZF55UosJ',
  90. "username" => $login,
  91. "password" => $password,
  92. "scope" => ""
  93. ));
  94. try{
  95. $response = $request->send();
  96. echo $response->getBody();
  97. }
  98. catch(Exception $ex){
  99. echo $ex;
  100. }
  101. }
  102. /**
  103. * Reload permissions
  104. */
  105. /**
  106. *
  107. */
  108. public function onLoad($param)
  109. {
  110. }
  111. /**
  112. * Logout
  113. */
  114. public static function onLogout()
  115. {
  116. SystemAccessLog::registerLogout();
  117. TSession::freeSession();
  118. AdiantiCoreApplication::gotoPage('LoginForm', '');
  119. }
  120. }
  121. ?>


Agradeço!!

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (7)


R

detalhe: nós apagamos a function onLogin, que é a padrão, e criamos a function auth.
mas se vir a calhar adaptar diretamente do onLogin, ótimo também.
JS

Rógerio,

Você pode adaptar o layout de sua tela de Login, alterando o arquivo login.html da pasta do tema escolhido (Ex: theme3)
No botão de Submit do Form coloque o evento onclick do botão desta forma:

<button id="tbutton_save" name="save" class="btn btn-primary btn-gradient btn-block" onclick="Adianti.waitMessage = 'Carregando';__adianti_post_data('form_login', 'class=LoginForm&method=onLogin');return false;">

onde 'form_login' é o id do seu Form

Desta forma mantém o método onLogin na classe LoginForm, e altere o código conforme desejado.

E não se esqueça de comentar a linha 65 da classe LoginForm ( parent::add($wrapper); ) para que não seja carregada a tela padrão de Login do Adianti.

Espero ter ajudado.

Abs</button>
R

Opa, então...
obrigado pela resposta, mas não é bem isso que quero fazer.
questão de modificar tela de login e coisas do gênero já realizei, e está ok.
o que quero de fato é alterar o funcionamento do login, sem ser como o que vem por padrão.
Mais ou menos assim: no login, coloco CPF e data de nascimento do usuário, mando essa requisição para a API(não é a nativa do adianti) que por sua vez autentica essa informação e retorna um token de acesso.
O que é beeem diferente da maneira como o adianti faz, que acaba por utilizar um banco SQLite local(permissions e os outros) com o TTransaction.
Se você ou mais alguém souber alguma maneira... realmente estou perdido.
JS

Blz Rogério, entendi errado me desculpe.

O que posso te ajudar é no seguinte, você pode direcionar as permissions e os outros bancos para banco de dados externos, não precisa utilizar os bancos SQLITE que vem no Adianti.

Dá uma olhada nas pastas

app/config
app/database

Na app/config tem os arquivos .ini de todos os bancos (permissions etc), basta configurá-los para acessar bancos externos (Ex: MySQL)

Na app/database tem os arquivos .sql com as estruturas destes bancos que você terá que importar para os bancos externos

Veja se essas configurações te ajuda, tenho utilizado com bancos externos nas minhas aplicações e tem funcionado sem problemas.

Abs
R

Obrigado pela resposta, amigo.

Porém, mais uma vez, não é o que estou fazendo. Vou tentar explicar bem por cima: eu tenho um formulário de login com os campos CPF e Data de nascimento. Quando eu preencho os campos e clico em Logar, é para minha aplicação fazer uma requisição POST para a minha API Lumen (Ex: { username: $_POST['cpf'], password: $_POST['datanasc'] }). Ao fazer a requisição, minha API vai comparar os dados enviados pela requisição com os dados do banco em que ela manipula. Se estiverem corretos, ela retornará um token de acesso.

O que eu quero saber é como adaptar o meu método nativo onLogin para que ele funcione desta forma que descrevi acima, SEM USO DE TTRANSACTION, SEM USO DE BANCOS, SEM USO DE NADA PADRÃO DO ADIANTI.

Fico no aguardo. Valeu!
NR

Os dados da autenticação do Adianti são gravados em sessão, então basicamente você precisa preencher essas informações. Veja que na função onLogin original você tem algo parecido com isso:
 
  1. <?php
  2. TSession::regenerate();
  3. $programs = $user->getPrograms();
  4. $programs['LoginForm'] = TRUE;
  5. TSession::setValue('logged', TRUE);
  6. TSession::setValue('login', $data->login);
  7. TSession::setValue('userid', $user->id);
  8. TSession::setValue('usergroupids', $user->getSystemUserGroupIds());
  9. TSession::setValue('userunitids', $user->getSystemUserUnitIds());
  10. TSession::setValue('username', $user->name);
  11. TSession::setValue('usermail', $user->email);
  12. TSession::setValue('frontpage', '');
  13. TSession::setValue('programs',$programs);
  14. if (!empty($user->unit))
  15. {
  16. TSession::setValue('userunitid',$user->unit->id);
  17. }
  18. if (!empty($ini['general']['multiunit']) and $ini['general']['multiunit'] == '1' and !empty($data->unit_id))
  19. {
  20. TSession::setValue('userunitid', $data->unit_id );
  21. }
  22. ?>

Então, a partir do token ou de outro modo você precisa capturar essas informações e salvá-las na sessão.
LJ

Acho que sua resposta esta neste artigo:

https://www.adianti.com.br/forum/pt/view_4813?servicos-rest-seguro-com-autorizac