Desejo redirecionar um usuário anônimo para o formulário de logon se esse usuário encontrar um erro 403.
Criei um assinante de evento e esse é o meu código, mas acabo em loop na página atual.
/**
* Redirect anonymous user to login page if he encounters 404 or 403
* response.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
* The created response object that will be returned.
* @param string $event
* The string representation of the event.
* @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
* Event dispatcher that lazily loads listeners and subscribers from the dependency injection
* container.
*/
public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
$routeMatch = RouteMatch::createFromRequest($response->getRequest());
$route_name = $routeMatch->getRouteName();
$is_anonymous = \Drupal::currentUser()->isAnonymous();
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
$query = $response->getRequest()->query->all();
// $query['destination'] = $routeMatch->getRouteObject()->getPath();
$query['destination'] = \Drupal::url('<current>');
$login_uri = \Drupal::url('user.login', [], ['query' => $query]);
$returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
$response->setResponse($returnResponse);
}
}
Eu acho que isso está relacionado ao fato de que a resposta já contém destination (uri atual) e system.404 e system.403 têm alguma alta prioridade que me impede de substituir isso.
8
routes
redirection
Pierre.Vriens
fonte
fonte
Respostas:
A maneira mais fácil é procurar
/admin/config/system/site-information
e preencher o campo que lêDefault 403 (access denied) page
comuser/login
fonte
Vi que essa pergunta nunca foi respondida como fazer isso programaticamente. O código realmente funciona, quando colocado em um Assinante de exceção:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
fonte
Olhando apenas o título desta pergunta (= Como redirecionar o usuário para o formulário de login do 403? ), Existem 2 opções para fazer isso, sem nenhum código personalizado envolvido, conforme detalhado abaixo.
Opção 1: Use o módulo CustomError
O módulo CustomError permite que o administrador do site crie páginas de erro personalizadas para os códigos de status HTTP 403 (acesso negado) e 404 (não encontrado), sem criar nós para cada um deles. Mais alguns detalhes sobre seus recursos (na página do projeto):
Você provavelmente se interessará principalmente pela parte sobre " Os usuários que não estiverem conectados e tentarem acessar uma área que requer login serão redirecionados para a página que estavam tentando acessar após o login ".
Para o D8, também está disponível uma versão 8.x-1.x-dev para este módulo, mais detalhes sobre ele podem ser encontrados na edição # 2219227 .
Opção 2: Use o módulo Regras
Suponha que o caminho da página "Padrão 403" esteja definido como
no_access
(via admin). Em seguida, crie uma regra usando o módulo Regras , com como Evento algo como "Depois de visitar o nóno_access
". Para que toda a regra fique assim:no_access
Condições:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Ações: redirecionamento de página -
Parameter: URL: user/login
Caso deseje fazer isso, você pode adicionar outra Ação para também exibir alguma mensagem (informativa) na área de mensagens do Drupal, com algo como "Você tentou visitar uma página para a qual o login é necessário ...".
É verdade que pode ser necessário ativar um módulo contribuído extra ( Regras ). Mas, como indicado por sua crescente popularidade também, esse módulo provavelmente já está ativado em praticamente qualquer site (semelhante ao módulo Views ), porque existem dezenas de casos de uso para este módulo.
Para o D8, também está disponível uma versão 8.x-3.x-alfa1 para este módulo, mais detalhes sobre a versão D8 podem ser encontrados na edição nº 2574691 , que inclui um link para o problema das regras " Regras 8.x Roteiro "
Se o acima exposto não ajudar, verifique se o motivo do seu loop (ou "alguma prioridade alta", como na sua pergunta) não pode ser evitado / explicado por algo semelhante à resposta à pergunta " Como especificar um evento de regras como "O conteúdo será visualizado"? ".
fonte
Eu acho que a solução para o seu problema é simples. Você pode criar facilmente uma página personalizada
404
e403
, dentro desta página, redirecionar usuários anônimos para a/user
página.Você pode usar este código
Sempre que ocorrer 404, você
page--404.tpl.php
será usado. Nesta página, use este códigoA página Como criar 403 e 404 personalizadas no Drupal explica outro método de criação de uma página para
403
e404
.fonte
8
formato #A maneira mais fácil de fazer isso é usar o módulo Redirecionar 403 para login do usuário (existe uma versão de desenvolvimento para o D8). Aqui está uma citação sobre ele (na página do projeto):
fonte
7
e6
(1) crie um nó da página com um alias como "/my403.html"
(2) vá para / admin / config / system / site-information e defina "/my403.html" como 403-Errorpage
(3) vá para / admin / structure / block e adicione o bloco "Login de usuário" (Sec. Forms) à região de conteúdo principal. Restrinja a aparência do bloco à página "my403.html" e à função "convidado".
É isso aí.
Se você precisar de mais controle, crie um controlador para sua página 403 e adicione o UserLoginForm manualmente.
Atenciosamente, Rainer
fonte