import {Unit} from '../lifecycle/Unit' import {Injectable, Inject, StaticInstantiable} from '../di' import {Logging} from '../service/Logging' import {Middlewares} from '../service/Middlewares' import {CanonicalResolver} from '../service/Canonical' import {Middleware} from '../http/routing/Middleware' import {AuthRequiredMiddleware} from './middleware/AuthRequiredMiddleware' import {GuestRequiredMiddleware} from './middleware/GuestRequiredMiddleware' import {SessionAuthMiddleware} from './middleware/SessionAuthMiddleware' import {ViewEngine} from '../views/ViewEngine' import {SecurityContext} from './context/SecurityContext' @Injectable() export class Authentication extends Unit { @Inject() protected readonly logging!: Logging @Inject() protected readonly middleware!: Middlewares async up(): Promise { this.middleware.registerNamespace('@auth', this.getMiddlewareResolver()) this.container().onResolve(ViewEngine) .then((engine: ViewEngine) => { engine.registerGlobalFactory('user', req => { return () => req?.make(SecurityContext)?.getUser() }) }) } protected getMiddlewareResolver(): CanonicalResolver> { return (key: string) => { return ({ required: AuthRequiredMiddleware, guest: GuestRequiredMiddleware, web: SessionAuthMiddleware, })[key] } } }