I think the RouterOutlet extension is a common way to achieve this.
Example posted some time ago in Gitter CaptainCodeman (not tested yet)
import {Directive, Injector, Attribute, ElementRef, DynamicComponentLoader} from 'angular2/core'; import {Router, RouteData, RouterOutlet, RouteParams, Instruction, ComponentInstruction} from 'angular2/router'; /* Example implementation Given a route: @RouteConfig([ { path: '/thing/:id', component: ThingComponent, name: 'Thing', data: { public: false, roles:['thinger'] } } ]) authorize(instruction: ComponentInstruction):boolean { // simplest case - route is public if (<boolean>instruction.routeData.data['public']) { return true; } // if not public then we at least need an authenticated user if (this.isAuthenticated()) { var routeRoles = <any[]>instruction.routeData.data['roles']; var userRoles = <string[]>this.roles(); // no roles required for route = user just needs to be authenticated var authorized = routeRoles.length === 0 || routeRoles.some(routeRole => userRoles.indexOf(routeRole) >= 0); return authorized; } return false; } */
export abstract class IAuthService { abstract isAuthenticated():boolean; authorize(instruction: ComponentInstruction, params:any):boolean { // authorized if route allows public access or user is authenticated return this.isAuthenticated() || <boolean>instruction.routeData.data['public'] } }
@Directive({selector: 'secure-outlet'}) export class SecureRouterOutlet extends RouterOutlet { signin:string; unauthorized:string; injector:Injector; private parentRouter: Router; private authService: IAuthService; constructor(_elementRef: ElementRef, _loader: DynamicComponentLoader, _parentRouter: Router, @Attribute('name') nameAttr: string, authService:IAuthService, injector:Injector, @Attribute('signin') signinAttr: string, @Attribute('unauthorized') unauthorizedAttr: string) { super(_elementRef, _loader, _parentRouter, nameAttr); this.parentRouter = _parentRouter; this.authService = authService; this.injector = injector; this.signin = signinAttr; this.unauthorized = unauthorizedAttr; } activate(nextInstruction: ComponentInstruction): Promise<any> { var params = this.getAllRouteParams(this.injector); var isAuthorized = this.authService.authorize(nextInstruction, params); if (isAuthorized) { return super.activate(nextInstruction); } if (this.authService.isAuthenticated()) { var ins = this.parentRouter.generate([this.unauthorized]); return super.activate(ins.component); } else { var ins = this.parentRouter.generate([this.signin,{url:location.pathname}]); return super.activate(ins.component); } } reuse(nextInstruction: ComponentInstruction): Promise<any> { return super.reuse(nextInstruction); } getAllRouteParams(injector) { let params = null; while(injector) { const routeParams = injector.getOptional(RouteParams); if (routeParams) { if (params === null) { params = {}; } else { params = Object.create(params); } Object.assign(params, routeParams.params); } injector = injector.parent; } return params; } }
Günter zöchbauer
source share