Skip to content
On this page

Router Guards

Router guards are used to protect routes from unauthorized access. For example, you can require users to log in before they can view a particular route or you can prevent them from navigating away from a page that has unsaved changes.

Implementing a guard

To implement a guard, you need to specify it as part of the route configuration. The following example shows how to implement a guard that checks whether the user is logged in:

typescript
const routes: Routes = [
  {
    path: '/admin',
    component: AdminComponent,
    guards: [LoggedInGuard]
  }
];

The LoggedInGuard is simply a function that receives the current pathname and returns a boolean value.

typescript
const LoggedInGuard = (pathname: string) => {
  const loggedIn = JSON.parse(localStorage.getItem('loggedIn') || 'false');
  if (!loggedIn) {
    return false;
  } else {
    return true;
  }
};

Redirecting to a different route

If a guard returns a string value, the router will take that string as the new pathname and redirect the user to that route.

typescript
const LoggedInGuard = (pathname: string) => {
  const loggedIn = JSON.parse(localStorage.getItem('loggedIn') || 'false');
  if (!loggedIn) {
    return '/login';
  } else {
    return true;
  }
};

Returning a promise

If a guard returns a promise, the router will wait for the promise to resolve before continuing. If the promise resolves to a string, the router will redirect to that route. If the promise resolves to a boolean, the router will continue if the value is true and redirect to the login page if the value is false.

typescript
const LoggedInGuard = (pathname: string) => {
  return new Promise((resolve, reject) => {
    const loggedIn = JSON.parse(localStorage.getItem('loggedIn') || 'false');
    if (!loggedIn) {
      resolve('/login');
    } else {
      resolve(true);
    }
  });
};

Released under the MIT License.