Meteor Router - how can I detect if current route requires user to be logged in

186 Views Asked by At

I'm using Iron router. Some routes of my project require to be rendered only if user is logged in, and some - no matter if user is logged in or not. I tried to registerHelper which defines if page requireLogin or not, but for some reason even if a route does require login, a wrong section is rendered.

Here's a layout template:

<template name="layout">

  {{#if requireLogin}}
    <!-- ... render route content or login form ... -->
      {{#if currentUser}}
        {{> yield}}
      {{/if}}
      {{#unless currentUser}}
        {{> loginPage}}
      {{/unless}}
  {{/if}}

  {{#unless requireLogin}}
    <!-- ... render route content ... -->
    {{> yield}}
  {{/unless}}

</template>

Example route pages with requireLogin information:

<template name="pageUser">
  {{requireLogin true}}
  <!-- ... some user page content ... -->
</template>

<template name="pageTermsOfUse">
  {{requireLogin false}}
  <!-- ... some Terms of use page content ... -->
</template>

And Client code:

if (Meteor.isClient) {
  Handlebars.registerHelper("requireLogin", function (requireLogin) {
    console.log(requireLogin)
    return requireLogin;
  });
};

A console.log should return true for User Page, and false for Terms of use Page, but instead it logs:

undefined
undefined
true

Even when requireLogin is set to True a section {{#unless requireLogin}} is rendered. Any suggestion how to solve this problem may help.

1

There are 1 best solutions below

0
On

You'll need to save the requireLogin value somewhere. You can simply use a session variable.

Template.registerHelper("requireLogin", function (requireLogin) {
  if(requireLogin) Session.set('requireLogin', requireLogin);
  return Session.get('requireLogin');
});

Also, I'd use Template and not Handlebars.