Como posso sair programaticamente de outro usuário no D7?

8

Em nosso site, temos contas de clientes, cada uma com um superadministrador e subusuários pertencentes a essa conta.

Queremos que o superadministrador consiga forçar o sub-usuário a sair. Qual é a melhor maneira de destruir a sessão de um usuário no Drupal que funciona independentemente de as informações da sessão serem armazenadas no Redis, Memcache ou no banco de dados?

Antes que alguém se sinta tentado a sugerir user_logout (), isso destrói a sessão do usuário atual . Eu quero que o usuário atual consiga destruir a sessão de um usuário diferente !

BrianV
fonte
Quase com certeza já temos uma pergunta sobre isso. Eu sei que tenho um patch em drush-extras para poder fazer isso, mas não foi confirmado.
mpdonadio
Eu pesquisei e procurei por DA, mas sem sorte. Vou revisar seu patch. EDIT: Infelizmente, seu patch lida apenas com o caso do banco de dados. Esperávamos usar o memcache, devido ao grande número de usuários / sessões!
BrianV
11
Acredito que bloquear / desbloquear o usuário tenha o mesmo efeito (exceto que provavelmente receberá uma notificação por email do desbloqueio). Você provavelmente poderia usar hook_mail_alter()para interceptar esse email e suprimi-lo.
tyler.frankenstein

Respostas:

6

drupal_session_destroy_uid() soa como uma aposta segura:

Encerra as sessões de um usuário específico.

A implementação principal limpa o banco de dados, como seria de esperar, mas qualquer módulo que substitua o session.inc e não forneça uma implementação funcional dessa função certamente será considerado quebrado (como user_delete_multiple()e outras funções precisam).

Portanto, em teoria, você deve poder usar essa função independentemente do armazenamento.

Clive
fonte
votar-se, esta é uma boa solução
Yusef
Esta é a solução correta! Para futuros leitores, é implementado no memcache. Veja cgit.drupalcode.org/memcache/tree/unstable/…
BrianV
1

O Proxy de Sessão fornece uma substituição genérica para o tratamento de sessões do Drupal, que deveria funcionar com vários back-ends.
Como tal, também implementa drupal_session_destroy_uid().

Observe que a implementação da sessão da API e da integração do Memcache é considerada instável e que o mantenedor do Redis recomenda o uso do Proxy de Sessão .

Os problemas de manipulação de sessões de maneira consistente em vários back-ends são descritos na edição 1260634 .

Fabian Iwand
fonte
0

No Drupal 7, podemos desconectar um usuário se tivermos seu User_ID usando db_delete ():

db_delete('sessions')->condition('uid', $User_ID)->execute();
houmem
fonte