Entendendo o Mecanismo de Persistência de Autenticação no Framework Yii2

No framework Yii2, a gestão da sessão do usuário e a funcionalidade de "lembrar-me" (login automático) são centralizadas no componente yii\web\User. Para compreender como o sistema mantém um usuário conectado ou o desloga automaticamente, é essencial analisar as propriedades principais e o fluxo de renovação do status de autentciação.

Configurações Fundamentais

O comportamento do sistema de login é definido por três propriedades básicas localizadas no arquivo vender/yiisoft/yii2/web/User.php:

  • $identityClass: Define a classe que implementa a IdentityInterface, responsável por localizar os dados do usuário.
  • $enableAutoLogin: Determina se o login baseado em cookies (o famoso "lembrar-me") está ativo.
  • $enableSession: Controla se o estado do usuário deve ser mantido via Session. Em APIs RESTful, essa propriedade geralmente é configurada como false.
// Exemplo de configuração no componente 'user' do Yii2
'user' => [
   'identityClass' => 'app\models\User',
   'enableAutoLogin' => true,
   'enableSession' => true,
],

O Fluxo de Verificação: renewAuthStatus()

Sempre que uma requisição é processada, o Yii2 executa internamente a lógica de verificação para garantir que o usuário ainda é válido. O método renewAuthStatus() é o coração desse processo. Abaixo, apresentamos uma representação lógica simplificada de como o framework decide se o usuário permanece autenticado:

protected function processAuthenticationState()
{
   $storage = Yii::$app->getSession();
   
   // Tenta recuperar o ID do usuário na sessão atual
   $userId = ($storage->getIsActive() || $storage->getHasSessionId()) 
       ? $storage->get($this->idParam) 
       : null;

   if ($userId !== null) {
       $userClass = $this->identityClass;
       $identity = $userClass::findIdentity($userId);
       $this->setIdentity($identity);
   } else {
       $identity = null;
   }

   // Validação de expiração por tempo de inatividade (Timeout)
   if ($identity && ($this->authTimeout !== null)) {
       $lastActivity = $storage->get($this->authTimeoutParam);
       
       if ($lastActivity !== null && $lastActivity < time()) {
           // Sessão expirada por inatividade
           $this->logout(false);
       } else {
           // Atualiza o tempo da última atividade
           $storage->set($this->authTimeoutParam, time() + $this->authTimeout);
       }
   }

   // Se não houver sessão ativa, tenta o login via Cookie (Lembrar-me)
   if ($this->getIsGuest() && $this->enableAutoLogin) {
       $this->loginByCookie();
   }
}

Funcionamento do Login por Cookie

Caso o sistema identifique que o usuário é um convidado (guest), mas a opção enableAutoLogin está ativada, o método loginByCookie() entra em ação. Ele busca por um cookie criptografado no navegador do cliente que contenha as informações necessárias (geralmente o ID do usuário e um auth_key) para restaurar a identidade sem a necessidade de uma nova sanha.

Se o cookie for válido e não tiver expirado, o sistema restaura a identidade do usuário e recria a sessão no servidor. Caso o usuário opte por deslogar manualmente, o Yii2 limpa tanto os dados da sessão quanto os cookies de autenticação persistente.

Tags: yii2 PHP autenticacao Web-Security session-management

Publicado em 6-13 23:40 por Thomas