blob: 905ac5fa9a4bdb0b6cb69d80d679dbc1132f5706 [file]
import { Module, DynamicModule, Global } from '@nestjs/common';
import * as casbin from 'casbin';
import { AuthZModuleOptions } from './interfaces';
import { AuthZGuard } from './authz.guard';
import { AUTHZ_MODULE_OPTIONS, AUTHZ_ENFORCER } from './authz.constants';
import { AuthZRBACService, AuthZManagementService } from './services';
@Global()
@Module({
providers: [],
exports: []
})
export class AuthZModule {
static register(options: AuthZModuleOptions): DynamicModule {
const moduleOptionsProvider = {
provide: AUTHZ_MODULE_OPTIONS,
useValue: options || {}
};
let enforcerProvider = options.enforcerProvider;
const importsModule = options.imports || [];
if (!enforcerProvider) {
if (!options.model || !options.policy) {
throw new Error(
'must provide either enforcerProvider or both model and policy'
);
}
enforcerProvider = {
provide: AUTHZ_ENFORCER,
useFactory: async () => {
const isFile = typeof options.policy === 'string';
let policyOption;
if (isFile) {
policyOption = options.policy as string;
} else {
policyOption = await options.policy;
}
return casbin.newEnforcer(options.model, policyOption);
}
};
}
return {
module: AuthZModule,
providers: [
moduleOptionsProvider,
enforcerProvider,
AuthZGuard,
AuthZRBACService,
AuthZManagementService
],
imports: importsModule,
exports: [
moduleOptionsProvider,
enforcerProvider,
AuthZGuard,
AuthZRBACService,
AuthZManagementService
]
};
}
}