Drupal 8 development: always redirect all logged out visitors to the login page

Feb 12, 2018

Stijn Berkers - Producer
+31 (0)20 - 261 14 99

Currently we are busy constructing the production of a realtime messaging platform in Drupal and NodeJS, look at it as a ‘WhatsApp for Business’. This Drupal system works like a web app; logging in is mandatory. How do you make sure that logged out visitors must log in to Drupal 8 before they are allowed to continue?

Drupal has many out-of-the-box functionalities, as well as a powerful API, but because it has so many functions many tracks are standardly available for anonymous visitors. We’d want to make all paths unreachable, until you log in.

That means that visitors always will be redirected to the login screen as long as they aren’t logged in. You wouldn’t want an anonymous user reaching internal news on the homepage.

Redirect URL in Drupal 8

  • Basically, we want all url’s / paths be made unavailable for non-logged in visitors, except explicitly specified pages like:
  • Login (/user)
  • Forgot password (/user/password)
  • Login link (user/reset/login)

in Drupal 7 you could use the module Logintoboggan for that purpose. You could also easily work around it in hook_init() or hook_boot() in a custom Drupal 7 module.

Quest

This was quite a puzzle, and we soon found some examples as well as exceptions. Everytime it didn’t work how we wanted it to. This example was the most useful.

Implementation in Drupal 8

Eventually, we got it working with the help of following code in a custom Drupal 8 module:

services.yml

put this file in your module root, and format yourmodulename.services.yml:

RedirectAnonymousSubscriber.php

Put the file RedirectAnonymousSubscriber.php in folder /src/EventSubscriber/ and do your custom thing:

Deze code haakt in op de EventSubscriber van Symfony, het framework waar Drupal 8 op gebouwd is.

Wrap up

Alright, that’s it. I hope the information as described will help you to always redirect visitors to the login page. Questions or feedback? Let me know!

We zoeken altijd naar optimale inzet van Drupal contrib modules. Maar in sommige gevallen voldoen ze niet aan benodigde eisen, wensen, stabiliteit en/of veiligheid. In dat geval ontwikkelen we de code op maat; eventueel met behulp van snippets uit andere modules.

Wanneer we dan maatwerk moeten ontwikkelen proberen we het altijd generiek maken, zodat er eventueel een contrib module van geproduceerd kan worden en vrijgegeven op Drupal.org. Dit doen we altijd in overleg met opdrachtgever.

Zo’n voorbeeld is de zojuist vrijgegeven module ‘Conditional Redirect’: een aantal modules kwamen in de buurt, maar voldeden net niet.

Drupal geheel afschermen middels login

Het gaat om volgende functionaliteit: stel dat je een systeem in Drupal produceert wat bedoeld is voor intern gebruik zoals een social intranet of project management app.

Dit systeem moet wel wereldwijd beschikbaar zijn, maar alleen toegankelijk nadat mensen ingelogd zijn. In dit geval wil je graag dat álle bezoekers die niet zijn ingelogd naar de login page worden door gelinkt.

Als extra wens: bepaalde pagina’s moeten wél publiekelijk beschikbaar zijn en dus als uitzondering hierin ingesteld worden.

Bovenstaande is gerealiseerd in de vrijgegeven module: na installatie hiervan zullen alle uitgelogde (anonieme) bezoekers naar de login page geredirect worden. Tevens zijn hierin uitzonderingen te configureren:

  • Content types;
  • Specifieke pagina’s;
  • Specifieke menu links.

Download de module hier

Wrap up

Alright, that’s it. Vragen of opmerkingen over deze module? Let me know, of schiet een issue in op de project page op Drupal.org

Photo by Dmitri Popov on Unsplash

Wanna stay informed?

Monthly Newsletter →

Comments

Need even
more knowlegde?