1

我正在使用 NbAuthJWTToken 和 ngx-admin 进行身份验证,但出现此错误:

错误错误:未捕获(承诺):错误:StaticInjectorError(AppModule)[NbIsGrantedDirective -> NbAccessChecker]:StaticInjectorError(平台:核心)[NbIsGrantedDirective -> NbAccessChecker]:NullInjectorError:NbAccessChecker没有提供者!错误:StaticInjectorError(AppModule)[NbIsGrantedDirective -> NbAccessChecker]:StaticInjectorError(平台:核心)[NbIsGrantedDirective -> NbAccessChecker]:NullInjectorError:没有 NbAccessChecker 的提供者!在 NullInjector.push../node_modules/@angular/core/fesm5/core.js.NullInjector.get (core.js:717) at resolveToken (core.js:954) at tryResolveToken (core.js:898) at StaticInjector .push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get (core.js:795) at resolveToken (core.js:954) at tryResolveToken (core.js:

这是我的文件内容:app.module.ts:

/**
 * @license
 * Copyright Akveo. All Rights Reserved.
 * Licensed under the MIT License. See License.txt in the project root for license information.
 */
import { APP_BASE_HREF } from '@angular/common';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { CoreModule } from './@core/core.module';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { ThemeModule } from './@theme/theme.module';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { AppService } from './app.service';

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    AppRoutingModule,

    NgbModule.forRoot(),
    ThemeModule.forRoot(),
    CoreModule.forRoot(),
  ],
  bootstrap: [AppComponent],
  providers: [
    { provide: APP_BASE_HREF, useValue: '/' },
    AppService
  ],
})
export class AppModule {
}

应用程序路由:

import { ExtraOptions, RouterModule, Routes } from '@angular/router';
import { NgModule } from '@angular/core';
import { AuthGuard } from './guards/auth.guard';

const routes: Routes = [
  { path: 'pages',canActivate: [AuthGuard], loadChildren: './pages/pages.module#PagesModule' },
  {
    path: 'auth',
    loadChildren: './@theme/components/auth/auth.module#AuthModule',
  },
  { path: '', redirectTo: 'pages', pathMatch: 'full' },
  { path: '**', redirectTo: 'pages' },
];

const config: ExtraOptions = {
  useHash: true,
};

@NgModule({
  imports: [RouterModule.forRoot(routes, config)],
  exports: [RouterModule],
})
export class AppRoutingModule {
}

核心模块:

import {
  ModuleWithProviders,
  NgModule,
  Optional,
  SkipSelf
} from "@angular/core";
import { CommonModule } from "@angular/common";
import {
  NbAuthModule,
  NbDummyAuthStrategy,
  NbPasswordAuthStrategy,
  NbAuthJWTToken
} from "@nebular/auth";
import { NbSecurityModule, NbRoleProvider } from "@nebular/security";
import { of as observableOf } from "rxjs";

import { throwIfAlreadyLoaded } from "./module-import-guard";
import { DataModule } from "./data/data.module";
import { AnalyticsService } from "./utils/analytics.service";
import { environment } from './../../environments/environment';

const socialLinks = [
  {
    url: "https://github.com/akveo/nebular",
    target: "_blank",
    icon: "socicon-github"
  },
  {
    url: "https://www.facebook.com/akveo/",
    target: "_blank",
    icon: "socicon-facebook"
  },
  {
    url: "https://twitter.com/akveo_inc",
    target: "_blank",
    icon: "socicon-twitter"
  }
];

export const NB_CORE_PROVIDERS = [
  ...DataModule.forRoot().providers,
  ...NbAuthModule.forRoot({
    strategies: [
      NbPasswordAuthStrategy.setup({
        name: "email",
        token: {
          class: NbAuthJWTToken,
          key: "token"
        },
        baseEndpoint: environment.apiEndpoint,
        login: {
          endpoint: "/login",
          method: "post"
        },
        requestPass: {
          endpoint: "/forgot",
          method: "post",
          redirect: {
            success: '/auth/reset-password',
            failure: null,
          },
        },
        resetPass: {
          endpoint: "/reset",
          method: "put",
          redirect: {
            success: '/auth/login',
            failure: null,
          },
          resetPasswordTokenKey: 'reset_password_token',
        },
        logout: {
          alwaysFail: false,
          endpoint: '/logout',
          method: 'delete',
          redirect: {
            success: '/auth/login',
            failure: null,
          },
        },
        register: {
          alwaysFail: false,
          endpoint: '/register',
          method: 'post',
          redirect: {
            success: '/auth/login',
            failure: null,
          },
        }
      })
    ],
    forms: {
      login: {
        redirectDelay: 0,
        strategy: 'email',
        rememberMe: true,
        showMessages: {
          success: true,
        },
      },
      register: {
        redirectDelay: 0,
        showMessages: {
          success: true,
        },
      },
      requestPassword: {
        redirectDelay: 0,
        showMessages: {
          success: true,
        },
      },
      resetPassword: {
        redirectDelay: 0,
        showMessages: {
          success: true,
        },
      },
      logout: {
        redirectDelay: 500,
      },
      validation: {
        name: {
          required: true,
        },
        phone: {
          required: true,
          minLength: 8,
          maxLength: 12,
        },
        password: {
          required: true,
        },
        email: {
          required: true
        },
        idNumber: {
          required: true,
          minLength: 8,
          maxLength: 12,
        },
      },
    }
  }).providers,
  AnalyticsService
];

@NgModule({
  imports: [CommonModule],
  exports: [NbAuthModule],
  declarations: []
})
export class CoreModule {
  constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
    throwIfAlreadyLoaded(parentModule, "CoreModule");
  }

  static forRoot(): ModuleWithProviders {
    return <ModuleWithProviders>{
      ngModule: CoreModule,
      providers: [...NB_CORE_PROVIDERS]
    };
  }
}

我还将 nebular auth 组件添加到我的项目和保护文件夹中

4

4 回答 4

2

你应该在你的 AppModule 中导入 NbSecurityModule。它为我解决。

于 2019-09-06T23:36:54.013 回答
1

在你的 app.module.ts 文件中添加:

进口:[ ... NbSecurityModule.forRoot(), ... ]

于 2019-10-08T06:27:27.523 回答
0

你需要提供这个也可以在 core.module.ts 中检查 ngx-admin 的完整示例 {提供:NbRoleProvider,useClass:NbSimpleRoleProvider,}

于 2019-02-25T20:55:01.303 回答
0

您发布的错误说您正在使用NbIsGrantedDirective并且该指令需要NbAccessChecker. 要提供NbAccessChecker,请安装npm i @nebular/security并导入SecurityModule您的应用程序。您可以在此处找到详细文档。

于 2019-01-17T08:54:16.923 回答