diff --git a/client/app.ts b/client/app.ts index 73b4439..e04dcd5 100644 --- a/client/app.ts +++ b/client/app.ts @@ -8,11 +8,10 @@ import MenuCmp from './components/menu'; import HeaderCmp from './components/header'; import FooterCmp from './components/footer'; import SubDetailCmp from './components/sub-detail'; -import LoggedInRouterOutlet from './logged-in-router-outlet'; @Component({ selector: 'sb-app', - directives: [ROUTER_DIRECTIVES, LoggedInRouterOutlet, HeaderCmp, FooterCmp], + directives: [ROUTER_DIRECTIVES, HeaderCmp, FooterCmp], template: ` diff --git a/client/bootstrap.ts b/client/bootstrap.ts index 3cd875b..cc55dc4 100644 --- a/client/bootstrap.ts +++ b/client/bootstrap.ts @@ -5,6 +5,7 @@ import {provide} from 'angular2/core'; import {HTTP_PROVIDERS, BrowserXhr} from 'angular2/http'; import {ROUTER_PROVIDERS} from 'angular2/router'; import App from './app'; +import Context from './context'; import BrowserXhrWithCredentials from './services/browser-xhr-with-credentials'; import AuthenticationService from './services/authentication'; import SubsService from './services/subs'; @@ -16,4 +17,5 @@ bootstrap(App, [ provide(AuthenticationService, {useClass: AuthenticationService}), provide(SubsService, {useClass: SubsService}), provide(BrowserXhr, {useClass: BrowserXhrWithCredentials}) -]).catch((err: any) => console.log(err)); +]).then((app: any) => { Context.injector = app.injector; }) + .catch((err: any) => console.log(err)); diff --git a/client/components/home.ts b/client/components/home.ts index bc3dbf7..1a7749d 100644 --- a/client/components/home.ts +++ b/client/components/home.ts @@ -1,7 +1,9 @@ import {Component} from 'angular2/core'; import {ROUTER_DIRECTIVES} from 'angular2/router'; import AuthenticationService from '../services/authentication'; +import Auth from './util/auth'; +@Auth @Component({ selector: 'sb-home', directives: [ROUTER_DIRECTIVES], diff --git a/client/components/logout.ts b/client/components/logout.ts index dc5fd73..6a48c34 100644 --- a/client/components/logout.ts +++ b/client/components/logout.ts @@ -1,7 +1,9 @@ import {Component} from 'angular2/core'; import {Router, ROUTER_DIRECTIVES} from 'angular2/router'; import AuthenticationService from '../services/authentication'; +import Auth from './util/auth'; +@Auth @Component({ selector: 'sb-logout', directives: [ROUTER_DIRECTIVES], diff --git a/client/components/menu.ts b/client/components/menu.ts index 1791944..2232efe 100644 --- a/client/components/menu.ts +++ b/client/components/menu.ts @@ -1,6 +1,8 @@ import {Component} from 'angular2/core'; import SubListCmp from './util/sub-list'; +import Auth from './util/auth'; +@Auth @Component({ selector: 'sb-menu', directives: [SubListCmp], diff --git a/client/components/sub-detail.ts b/client/components/sub-detail.ts index fe900b8..1948966 100644 --- a/client/components/sub-detail.ts +++ b/client/components/sub-detail.ts @@ -3,7 +3,9 @@ import {RouteParams, ROUTER_DIRECTIVES} from 'angular2/router'; import SubPriceCmp from './util/sub-price'; import SubsService from '../services/subs'; import Sub from '../models/sub'; +import Auth from './util/auth'; +@Auth @Component({ selector: 'sb-subdetail', directives: [SubPriceCmp, ROUTER_DIRECTIVES], diff --git a/client/components/util/auth.ts b/client/components/util/auth.ts new file mode 100644 index 0000000..fa3c4ed --- /dev/null +++ b/client/components/util/auth.ts @@ -0,0 +1,14 @@ +import {Router, CanActivate} from 'angular2/router'; +import AuthenticationService from '../../services/authentication'; +import Context from '../../context'; + +export default function (constr: Function): any { + return CanActivate(() => { + if (Context.injector.get(AuthenticationService).authenticated) { + return true; + } else { + Context.injector.get(Router).navigate(['Login']); + return false; + } + })(constr); +} diff --git a/client/context.ts b/client/context.ts new file mode 100644 index 0000000..488960d --- /dev/null +++ b/client/context.ts @@ -0,0 +1,13 @@ +import {Injector} from 'angular2/core'; + +export default class Context { + private static _injector: Injector; + + static get injector (): Injector { + return this._injector; + } + + static set injector (value: Injector) { + this._injector = value; + } +} diff --git a/client/logged-in-router-outlet.ts b/client/logged-in-router-outlet.ts deleted file mode 100644 index 5c28167..0000000 --- a/client/logged-in-router-outlet.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {Directive, Attribute, ElementRef, DynamicComponentLoader} from 'angular2/core'; -import {Router, RouterOutlet, ComponentInstruction} from 'angular2/router'; -import AuthenticationService from './services/authentication'; - -@Directive({ - selector: 'router-outlet' -}) -export default class LoggedInRouterOutlet extends RouterOutlet { - private _publicRoutes: any; - private _parentRouter0: Router; - private _authenticationService: AuthenticationService; - - constructor(elementRef: ElementRef, loader: DynamicComponentLoader, - parentRouter: Router, @Attribute('name') nameAttr: string, - authenticationService: AuthenticationService) { - super(elementRef, loader, parentRouter, nameAttr); - this._parentRouter0 = parentRouter; - this._authenticationService = authenticationService; - this._publicRoutes = { - '/login': true, - '/identify': true - }; - } - - activate (instruction: ComponentInstruction): Promise { - let url: string = this._parentRouter0.lastNavigationAttempt; - const pos: number = url.indexOf('?'); - if (pos >= 0) { - url = url.substr(0, pos); - } - if (!this._publicRoutes[url] && !this._authenticationService.authenticated) { - this._parentRouter0.navigate(['Login']); - } - return super.activate(instruction); - } -}