So the documentation looks like this is what it exports.
export CanActivate(options : CanActivateAnnotation) : (hook: (next: ComponentInstruction, prev: ComponentInstruction) =>
Promise<boolean>| boolean) => ClassDecorator
@CanActivate((next, prev) => {
// This must prove to be true for the component @ this route to load
if(next.urlPath != '/Login'){
return Promise.resolve(this._authService.getIsAuth()
&& localStorage.getItem('authToken')
}
/*
If CanActivate returns or resolves to false, the navigation is
cancelled. If CanActivate throws or rejects, the navigation is also
cancelled. If CanActivate returns or resolves to true, navigation
continues, the component is instantiated, and the OnActivate hook of
that component is called if implemented.
*/
}
);
At the bottom of the Angular2 documentation they add this snippet :
exported from angular2/router
https://angular.io/docs/ts/latest/api/router/CanActivate-decorator.html
So if you are looking to do redirection from a higher level.
You would not use the CanActivate decorator you would do the following.
import {Directive, Attribute, ElementRef, DynamicComponentLoader} from 'angular2/core';
import {Router, RouterOutlet, ComponentInstruction} from 'angular2/router';
import {Login} from '../login/login';
import {UserService} from '../../Services/userService'; // a service to handle auth
@Directive({
selector: 'router-outlet'
})
export class AuthRouterOutlet extends RouterOutlet {
publicRoutes: any;
private parentRouter: Router;
constructor(private _userService:UserService, _elementRef: ElementRef, _loader: DynamicComponentLoader,
_parentRouter: Router, @Attribute('name') nameAttr: string) {
super(_elementRef, _loader, _parentRouter, nameAttr);
this.parentRouter = _parentRouter;
this.publicRoutes = {
'/login': true,
'/signup': true
};
// publicRoutes will be the routes auth is not needed for.
}
activate(instruction: ComponentInstruction) {
var url = this.parentRouter.lastNavigationAttempt;
if (!this.publicRoutes[url] && this._userService.getAuth()) {
// todo: redirect to Login, may be there a better way?
this.parentRouter.navigateByUrl('/login');
}
return super.activate(instruction);
// we return super.activate(instruction) here so the router can activate the requested route and it's components.
}
}
This implementation handles any new request to a directive and runs the activate function where your route authentication logic will be.
The code above would be called something like AuthRouterOutlet.
and you would have to add it to your app.ts via the
directives: [ AuthRouterOutlet]