PageRenderTime 26ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/docs/guide-pt-BR/security-authentication.md

https://gitlab.com/brucealdridge/yii2
Markdown | 185 lines | 137 code | 48 blank | 0 comment | 0 complexity | b12120c0c85f9e2b4d3be8668eb5126b MD5 | raw file
  1. Autenticação
  2. ==============
  3. Autenticação é o processo de verificação da identidade do usuário. geralmente é usado um identificador (ex. um nome de usuário ou endereço de e-mail) e um token secreto (ex. uma senha ou um token de acesso) para determinar se o usuário é quem ele diz ser. Autenticação é a base do recurso de login.
  4. Yii fornece um framework de autenticação com vários componentes que dão suporte a login. Para usar este framework, você precisa primeiramente fazer o seguinte:
  5. * Configurar o componente [[yii\web\User|user]] da aplicação;
  6. * Criar uma classe que implementa a interface [[yii\web\IdentityInterface]].
  7. ## Configurando [[yii\web\User]] <span id="configuring-user"></span>
  8. O componente [[yii\web\User|user]] da aplicação gerencia o status de autenticação dos usuários. Ele requer que você especifique uma [[yii\web\User::identityClass|identity class]] que contém a atual lógia de autenticação.
  9. Na cofiguração abaixo, o [[yii\web\User::identityClass|identity class]] do
  10. [[yii\web\User|user]] é configurada para ser `app\models\User` cuja implementação é explicada na próxima subseção:
  11. ```php
  12. return [
  13. 'components' => [
  14. 'user' => [
  15. 'identityClass' => 'app\models\User',
  16. ],
  17. ],
  18. ];
  19. ```
  20. ## Implementação [[yii\web\IdentityInterface]] <span id="implementing-identity"></span>
  21. O [[yii\web\User::identityClass|identity class]] deve implementar a interface [[yii\web\IdentityInterface]] que contém os seguintes métodos:
  22. * [[yii\web\IdentityInterface::findIdentity()|findIdentity()]]: ele procura por uma instância da classe de identidade usando o ID de usuário especificado. Este método é usado quando você precisa manter o status de login via sessão.
  23. * [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]: ele procura por uma instância da classe de identidade usando o token de acesso informado. Este método é usado quando você precisa autenticar um usuário por um único token secreto (ex. Em uma aplicação stateless RESTful).
  24. * [[yii\web\IdentityInterface::getId()|getId()]]: Retorna o ID do usuário representado por essa instância da classe de identidade.
  25. * [[yii\web\IdentityInterface::getAuthKey()|getAuthKey()]]: retorna uma chave para verificar login via cookie. A chave é mantida no cookie de login e será comparada com o informação do lado servidor para atestar a validade do cookie.
  26. * [[yii\web\IdentityInterface::validateAuthKey()|validateAuthKey()]]: Implementa a lógica de verificação da chave de login via cookie.
  27. Se um método em particular não for necessário, você pode implementá-lo com um corpo vazio. Por exemplo, se a sua aplicação é somente stateless RESTful, você precisa implementar [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]
  28. e [[yii\web\IdentityInterface::getId()|getId()]] deixando todos os outros métodos com um corpo vazio.
  29. No exemplo a seguir, um [[yii\web\User::identityClass|identity class]] é implementado como uma classe [Active Record](db-active-record.md) associada com a tabela `user` do banco de dados.
  30. ```php
  31. <?php
  32. use yii\db\ActiveRecord;
  33. use yii\web\IdentityInterface;
  34. class User extends ActiveRecord implements IdentityInterface
  35. {
  36. public static function tableName()
  37. {
  38. return 'user';
  39. }
  40. /**
  41. * Finds an identity by the given ID.
  42. *
  43. * @param string|integer $id the ID to be looked for
  44. * @return IdentityInterface|null the identity object that matches the given ID.
  45. */
  46. public static function findIdentity($id)
  47. {
  48. return static::findOne($id);
  49. }
  50. /**
  51. * Finds an identity by the given token.
  52. *
  53. * @param string $token the token to be looked for
  54. * @return IdentityInterface|null the identity object that matches the given token.
  55. */
  56. public static function findIdentityByAccessToken($token, $type = null)
  57. {
  58. return static::findOne(['access_token' => $token]);
  59. }
  60. /**
  61. * @return int|string current user ID
  62. */
  63. public function getId()
  64. {
  65. return $this->id;
  66. }
  67. /**
  68. * @return string current user auth key
  69. */
  70. public function getAuthKey()
  71. {
  72. return $this->auth_key;
  73. }
  74. /**
  75. * @param string $authKey
  76. * @return boolean if auth key is valid for current user
  77. */
  78. public function validateAuthKey($authKey)
  79. {
  80. return $this->getAuthKey() === $authKey;
  81. }
  82. }
  83. ```
  84. Como explicado anteriormente, você precisa implementar `getAuthKey()` e `validateAuthKey()` se a sua aplicação usa recurso de login via cookie. Neste caso, você pode utilizar o seguinte código para gerar uma chave de autenticação para cada usuário
  85. e gravá-la na tabela `user`:
  86. ```php
  87. class User extends ActiveRecord implements IdentityInterface
  88. {
  89. ......
  90. public function beforeSave($insert)
  91. {
  92. if (parent::beforeSave($insert)) {
  93. if ($this->isNewRecord) {
  94. $this->auth_key = \Yii::$app->security->generateRandomString();
  95. }
  96. return true;
  97. }
  98. return false;
  99. }
  100. }
  101. ```
  102. > Observação: Não confunda a classe de identidade `User` com [[yii\web\User]]. O primeiro é a classe que implementa a lógica de autenticação. Muitas vezes, é implementado como uma classe [Active Record](db-active-record.md) associado com algum tipo de armazenamento persistente para armazenar as informações de credenciais do usuário. O último é um componente da apicação responsável pela gestão do estado de autenticação do usuário.
  103. ## Usando [[yii\web\User]] <span id="using-user"></span>
  104. Você usa o [[yii\web\User]] principalmente como um componente `user` da aplicação.
  105. É possível detectar a identidade do usuário corrente utilizando a expressão `Yii::$app->user->identity`. retorna uma instância de [[yii\web\User::identityClass|identity class]] representando o atual usuário logado, ou null se o usuário corrente não estiver autenticado (acessando como convidado). O código a seguir mostra como recuperar outras informações relacionadas à autenticação de [[yii\web\User]]:
  106. ```php
  107. // identidade do usuário corrente. Null se o usuário não estiver autenticado.
  108. $identity = Yii::$app->user->identity;
  109. // o ID do usuário corrente. Null se o usuário não estiver autenticado.
  110. $id = Yii::$app->user->id;
  111. // se o usuário atual é um convidado (não autenticado)
  112. $isGuest = Yii::$app->user->isGuest;
  113. ```
  114. Para logar um usuário, você pode usar o seguinte código:
  115. ```php
  116. // encontrar uma identidade de usuário com o nome de usuário especificado.
  117. // note que você pode quere checar a senha se necessário
  118. $identity = User::findOne(['username' => $username]);
  119. // Logar o usuário
  120. Yii::$app->user->login($identity);
  121. ```
  122. O método [[yii\web\User::login()]] define a identidade do usuário atual para o [[yii\web\User]]. Se a sessão está [[yii\web\User::enableSession|enabled]], ele vai manter a identidade na sessão para que o status de autenticação do usuário seja mantido durante toda a sessão. Se for login via cookie(ex. login "remember me") for [[yii\web\User::enableAutoLogin|enabled]], ele também guardará a identidade em um cookie para que o estado de autenticação do usuário possa ser recuperado a partir do cookie enquanto o cookie permanece válido.
  123. A fim de permitir login via cookie, você pode configurar [[yii\web\User::enableAutoLogin]] como true na configuração da aplicação. Você também precisará fornecer um parâmetro de tempo de duração quando chamar o método [[yii\web\User::login()]].
  124. Para realizar o logout de um usuário, simplesmente chame
  125. ```php
  126. Yii::$app->user->logout();
  127. ```
  128. Note que o logout de um usuário tem sentido quando a sessão está habilitada. O método irá limpar o status de autenticação de usuário de memória e sessão. E por padrão, ele também destruirá *todos* os dados da sessão do usuário. Se você quiser guardar os dados da sessão, você deve chamar `Yii::$app->user->logout(false)`.
  129. ## Eventos de Autenticação <span id="auth-events"></span>
  130. A classe [[yii\web\User]] dispara alguns eventos durante os processos de login e logout.
  131. * [[yii\web\User::EVENT_BEFORE_LOGIN|EVENT_BEFORE_LOGIN]]: disparado no início de [[yii\web\User::login()]].
  132. Se o manipulador de evento define a propriedade [[yii\web\UserEvent::isValid|isValid]] do objeto de evento para false, o processo de login será cancelado.
  133. * [[yii\web\User::EVENT_AFTER_LOGIN|EVENT_AFTER_LOGIN]]: dispara após de um login com sucesso.
  134. * [[yii\web\User::EVENT_BEFORE_LOGOUT|EVENT_BEFORE_LOGOUT]]: dispara no início de [[yii\web\User::logout()]]. Se o manipulador de evento define a propriedade [[yii\web\UserEvent::isValid|isValid]] do objeto de evento para false, o processo de logout será cancelado.
  135. * [[yii\web\User::EVENT_AFTER_LOGOUT|EVENT_AFTER_LOGOUT]]: dispara após um logout com sucesso.
  136. Você pode responder a estes eventos implementando funcionalidades, tais como auditoria de login, estatísticas de usuários on-line. Por exemplo, no manipulador
  137. [[yii\web\User::EVENT_AFTER_LOGIN|EVENT_AFTER_LOGIN]], você pode registrar o tempo de login e endereço IP na tabela `user`.