// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Criando uma Aplicação Orientada pelo Banco de Dados com o PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Criando uma Aplicação Orientada pelo Banco de Dados com o PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Orientada pelo Banco de Dados com o PHP

= Lição 5: Adicionando Segurança. Implementando o Log-in do Usuário da Aplicação
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Lição 5: Adicionando Segurança. Implementando o Log-in do Usuário da Aplicação - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 5: Adicionando Segurança. Implementando o Log-in do Usuário da Aplicação

Nesta lição, você implementará a funcionalidade de log-in para um wisher. Isso afeta os seguintes arquivos:

*  `index.php` 
*  `createnewwisher.php` 
*  `editWishlist.php` 
*  `db.php` 

Implementar a funcionalidade de log-in consiste nas seguintes etapas:

1. <<_saving_the_wisher_s_id_in_the_session_upon_creation,Salvar o wisher ID na Sessão em criação de um wisher>>
2. <<_validating_user_logon,Validar se o usuário que tenta editar um desejo está conectado>>
3. <<_html_form_for_logon_on_index_php,Fazer log-in do wisher na página index.php>>

O documento atual é uma parte do tutorial Criando uma Aplicação CRUD no NetBeans IDE para PHP.

[[_application_source_code_from_the_previous_lesson]]
== Código-fonte da Aplicação da Lição Anterior

Usuários MySQL: clique link:https://netbeans.org/files/documents/4/1930/lesson4.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior estiver concluída.

Usuários do banco de dados Oracle: clique link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson4.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior for concluída.

[[_saving_the_wisher_s_id_in_the_session_upon_creation]]
== Salvando o wisher ID na Sessão Em Criação

Uma link:http://us2.php.net/manual/en/ref.session.php[+Sessão+] é um armazenamento duradouro para transferir informações de uma página para outra sem usar um link:wish-list-lesson5.html#htmlForm[+form de entrada HTML+]. Essa funcionalidade tem suporte por meio de um array PHP predefinido  `$_SESSION` .

Por motivos de segurança, depois que um novo wisher é criado, ele deve se conectar automaticamente sem preencher um form. Portanto, você precisa modificar o arquivo  `createNewWisher.php`  para implementar a seguinte funcionalidade:

* Adicione um novo wisher ao banco de dados.
* Abra uma sessão.
* Armazene o nome do wisher na sessão.
* Transfira o nome do wisher na sessão quando ele for redirecionado para a página  `editWishList.php` .

No arquivo  `createNewWisher.php` , localize a linha:


[source,php]
----

WishDB::getInstance()->create_wisher($_POST['user'], $_POST['password']);
----

e insira o seguinte bloco de código abaixo:

[source,php]
----

session_start();
$_SESSION['user'] = $_POST['user'];
----

O bloco de código inicia uma sessão, o que significa abrir o array  `$_SESSION`  para inserir ou recuperar dados. Em seguida, o código adiciona um elemento ao array  `$_SESSION` . O elemento adicionado contém um valor e um identificador (chave). O valor é o nome dos wishers recém-criados e o identificador é "user". Em seguida, o programa redireciona o wisher para a página  `editWishList.php` .

[[_validating_user_logon]]
== Validando o Log-in do Usuário

Quando um usuário chega à página  `editWishList.php` , a aplicação deve confirmar que a página foi acessada pela mesma pessoa que acabou de se registrar na página  `createNewWisher.php` .

Implementar essa funcionalidade consiste em duas etapas:

* <<_retrieving_the_wisher_s_name_from_the_session,Recuperando o nome do wisher na Sessão>>
* <<_logging_in_from_the_index_php_page,Redirecionar o usuário para o index.php, caso a recuperação do nome do wisher na sessão tenha falhado>>

[[_retrieving_the_wisher_s_name_from_the_session]]
=== Recuperando o Nome do Wisher da Sessão

Substitua o código default no bloco PHP de  `editWishList.php`  pelo seguinte:

[source,php]
----

session_start();
if (array_key_exists("user", $_SESSION)) {
  echo "Hello " . $_SESSION['user'];
}
----

O bloco de código abre o array  `$_SESSION`  para recuperar dados e verifica se  `$_SESSION`  contém um elemento com o identificador "user". Se a verificação for bem-sucedida, o código imprime uma mensagem de boas-vindas.

Para verificar se a sessão foi implementada corretamente:

1. Execute o arquivo  `createNewWisher.php`  e crie um novo wisher, por exemplo, Jack.
O  `editWishList.php`  abre com "Hello Jack" (Olá, Jack).

[start=2]
. Limpe os cookies da sessão em seu browser ou termine a sessão e execute  `editWishList.php`  no IDE.
O arquivo  `editWishList.php`  abre com Hello porque nenhum usuário foi transferido a uma sessão. Isso não é correto, porque permite que alguém que não esteja conectado e não esteja registrado crie ou edite uma lista de desejos. Para evitar isso, o usuário precisa ser redirecionado para a página  `index.php` .

[[_logging_in_from_the_index_php_page]]
=== Redirecionando um Usuário Que Não Está Conectado

Adicione o bloco de código seguinte ao  `editWishList.php` , abaixo da cláusula  `if` :

[source,php]
----

else {
  header('Location: index.php');
  exit;
}
----

O código redireciona o usuário para a página index.php e cancela a execução do código PHP.

Para verificar se a funcionalidade foi implementada corretamente, execute o arquivo  `editWishList.php` . O resultado esperado é que a página  `index.php`  abra.

[[_html_form_for_logon_on_index_php]]
== Fazendo log-in na página index.php

O log-in na página index.php consiste em duas etapas:

* <<_html_form_for_logon_on_index_php,Indicando o nome e a senha do usuário em um form de entrada HTML e enviando os dados para validação à página index.php.>>
* <<_logon_validation,Validando o log-in>>

[[_html_form_for_logon_on_index_php]]
=== Form HTML para Log-in em index.php

No arquivo  `index.php` , insira o código a seguir antes de fechar a tag  `</body>` :

[source,xml]
----

<form name="logon" action="index.php" method="POST" >
  Username: <input type="text" name="user">
  Password  <input type="password" name="userpassword">
  <input type="submit" value="Edit My Wish List">
</form>
----

*Observação: *você pode ignorar as advertências do validador HTML.

O código apresenta um link:wish-list-lesson3.html#htmlForm[+form HTML+] que permite inserir o nome e a senha do usuário nos campos de texto. Quando o usuário clica em Editar Minha Lista de Desejos, os dados são transferidos para a mesma página, index.php.

[[_logon_validation]]
=== Validação de Log-in

A validação do log-in envolve:

* <<_logon_validation,Verificação de onde o usuário foi redirecionado>>.
* <<_logon_validation,Verificação do nome e senha do usuário>>.
* Salvar o nome do usuário na Sessão e redirecionar o usuário para a página editWishList.php ou <<_logon_validation,Exibir uma mensagem de erro.>>

Um usuário pode acessar a página  `index.php`  ao iniciar a aplicação, ou na página<<_function_verify_wisher_credentials, editWishList.php>>, ou quando redirecionado da página  `index.php`  depois de inserir o nome e a senha.

Como o link:http://www.htmlcodetutorial.com/forms/_FORM_METHOD.html[+método de solicitação HTML+] POST é usado somente em último caso, você sempre pode saber onde o usuário estava localizado quando acessou o  `index.php` .

No arquivo index.php, crie um bloco <?php ?> acima do bloco HTML, com o seguinte código:

[source,php]
----

<?php
require_once("Includes/db.php");
$logonSuccess = false;

// verify user's credentials
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $logonSuccess = (WishDB::getInstance()->verify_wisher_credentials($_POST['user'], $_POST['userpassword']));
    if ($logonSuccess == true) {
      session_start();
      $_SESSION['user'] = $_POST['user'];
      header('Location: editWishList.php');
      exit;
    }
}
?>
----

O início do código permite que o usuário use o arquivo  `db.php`  e inicialize a variável  `$log-inSuccess`  com o valor  `false` . Se a validação ocorrer, esse valor mudará para  `true` .

O código que verifica as credenciais do usuário verifica primeiro se o método de solicitação é POST. Se o método for POST, o usuário foi redirecionado depois de enviar o <<_html_form_for_logon_on_index_php,form de log-in>>. Nesse caso, o bloco de código chama a função  `verify_wisher_credentials`  com o nome e a senha inseridas no form de log-in.

A função  `verify_wisher_credentials` , que você escreverá <<_function_verify_wisher_credentials,na próxima seção>>, verifica se há um registro na tabela de  `wishers`  em que o usuário e a senha são confrontados com os valores enviados no <<verify_wisher_credentials,form de log-in>>. Se a função  `verify_wisher_credentials`  retornar  `true` , um wisher com a combinação de nome e senha será registrado no banco de dados. Isso significa que a validação ocorreu e que  `$log-inSuccess`  muda o valor para  `true` . Nesse caso, a seção é iniciada e o array  `$_SESSION`  abre. O código adiciona um novo elemento ao array  `$_SESSION` . O elemento contém um valor e um identificador (chave). O valor é o nome do wisher e o identificador é "user". Em seguida, o código redireciona o usuário para a página  `editWishList.php`  para editar a lista de desejos.

Se a função  `verify_wisher_credentials`  retornar  `false` , o valor da variável  `$log-inSuccess`  permanece falso. O valor da variável é usado em <<_displaying_error_messages,exibindo uma mensagem de erro>>.

[[_function_verify_wisher_credentials]]
=== Função verify_wisher_credentials

Para implementar a verificação das credenciais do wisher, você precisa adicionar uma nova função à classe  `WishDB`  no arquivo  `db.php` . A função requer um nome e uma senha como parâmetros de entrada e retorna 0 ou 1.

*Para o banco de dados MySQL*, insira o seguinte bloco de código:

[source,php]
----

public function verify_wisher_credentials($name, $password) {
  $name = $this->real_escape_string($name);
  $password = $this->real_escape_string($password);
  $result = $this->query("SELECT 1 FROM wishers WHERE name = '"
                  . $name . "' AND password = '" . $password . "'");
  return $result->data_seek(0);
}
----

*Para o banco de dados Oracle*, insira o seguinte bloco de código (como o OCI8 não tem equivalente para  `mysql_num_rows` , este código é uma forma modificada de  `get_wisher_id_by_name` ):


[source,php]
----

public function verify_wisher_credentials($name, $password) {
  $query = "SELECT 1 FROM wishers WHERE name = :name_bv AND password = :pwd_bv";
  $stid = oci_parse($this->con, $query);
  oci_bind_by_name($stid, ':name_bv', $name);
  oci_bind_by_name($stid, ':pwd_bv', $password);
  oci_execute($stid);

//Because name is a unique value I only expect one row
  $row = oci_fetch_array($stid, OCI_ASSOC);
  if ($row)
    return true;
  else
    return false;
}
----

O bloco de código executa a consulta  ` "SELECT 1 FROM wishers WHERE Name = '" . $name . "' AND Password = '". $password. "'"`  e retorna o número de registros que atendam à consulta especificada. Se o registro for encontrado, a função retorna  `true` . Se não houver registro no banco de dados, a função retornará  `false` .

[[_displaying_error_messages]]
=== Exibindo Mensagens de Erro

Para permitir que a aplicação exiba mensagens de erro, insira o seguinte bloco de código <? php?> no form de log-in em  `index.php` , abaixo dos campos de entrada, mas acima do botão:

[source,php]
----

<?php
if ($_SERVER['REQUEST_METHOD'] == "POST") {
  if (!$logonSuccess)
    echo "Invalid name and/or password";
}
?>
----

O bloco de código verifica o valor da variável $log-inSuccess e se ele for falso, exibe uma mensagem de erro.

[[_testing_the_logon_from_the_index_php_page]]
== Testando o Log-in na Página index.php

Para verificar se a funcionalidade de log-in funciona corretamente na página inicial  `index.php` :

1. Execute a aplicação.
2. Na página  `index.php` , digite Tom na caixa de edição Nome do Usuário e Tim na caixa de edição Senha.
3. Pressione Editar Minha Lista de Desejos. É exibida uma mensagem de erro (observe que a janela de browser abaixo é reduzida para 600 px de largura, o que acrescenta algumas quebras de linha): 

image::images/incorrectNamePasswordIndex.png[]


[start=4]
. Digite Tom na caixa de edição Nome de Usuário e tomcat na caixa de edição Senha.

[start=5]
. Clique em Editar Minha Lista de Desejos. É exibida a página editWishList.php: 

image::images/SuccessfulLogonOnIndexRedirectToEditWishList.png[]

[[application_source_code_after_the_current_lesson_is_completed]]
== O código-fonte da Aplicação após a Lição Atual está Concluído

Usuários MySQL: clique link:https://netbeans.org/files/documents/4/1931/lesson5.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição estiver concluída.

Usuários do banco de dados Oracle: clique link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson5.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição for concluída.

[[_next_steps]]
== Próximas Etapas

link:wish-list-lesson4.html[+<< Lição anterior+]

link:wish-list-lesson6.html[+Próxima lição >>+]

link:wish-list-tutorial-main-page.html[+Voltar à página principal do Tutorial+]


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%205:%20Implementing%20Security[+Enviar Feedback neste Tutorial+]


Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, link:../../../community/lists/top.html[+junte-se à lista de correspondência users@php.netbeans.org+].

link:../../trails/php.html[+Voltar à Trilha do Aprendizado PHP+]

