"No hay proveedor para AuthGuard!"uso de canActivate en Angular 2


EDITAR: Obviamente esto está desactualizado, ahora proporciona su guardia en el array providers en un NgModule. Vea otras respuestas o documentación oficial para obtener más información.

  • el bootstrapping en un componente está desactualizado
  • provideRouter() también está desactualizado


Estoy intentando configurar la autenticación en mi proyecto, usando un login y AuthGuard de la guía Angular2: https://angular.io/docs/ts/latest/guide/router.html

Estoy usando la versión: "@ angular / router": "3.0.0-beta.1".

Voy a tratar de explicar tanto como sea posible, no dude en decirme si necesita más detalles.


Tengo mi principal.ts archivo que boostraps la aplicación con el siguiente código:

bootstrap(MasterComponent, [
    APP_ROUTER_PROVIDERS,
    MenuService
])
.catch(err => console.error(err));

Cargo el MasterComponent, que carga un Encabezado que contiene botones que me permiten navegar a través de mi aplicación y también contiene mi principal por ahora.

Estoy siguiendo la guía para hacer que mi aplicación funcione de la misma manera, con la siguiente aplicación.ruta.ts :

export const routes: RouterConfig = [
    ...LoginRoutes,
    ...MasterRoutes
];

export const APP_ROUTER_PROVIDERS = [
    provideRouter(routes),
    AUTH_PROVIDERS
];

Y el inicio de sesión .ruta.ts de la guía, que define mi AuthGuard:

export const LoginRoutes = [
    { path: 'login', component: LoginComponent }
];

export const AUTH_PROVIDERS = [AuthGuard, AuthService];

Mi componente Maestro tiene su propia definición de ruta, que también contiene el guardia que estoy tratando de configurar. maestro.ruta.ts :

export const MasterRoutes : RouterConfig = [
    { path: '', redirectTo: '/accueil', pathMatch: 'full' },

    {
        path: 'accueil',
        component: AccueilComponent
    },

    { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
];

Y estoy usando los mismos archivos que la guía, que son auth.guardia.ts, auth.Servicio.ts, login.componente.inicio de sesión ts y .ruta.ts .


En mi cabecera.componente.archivo ts , cuando intento acceder a cualquier ruta, funciona bien, pero cuando intento acceder a la ruta protegida (/dashboard), obtengo el No hay proveedor para AuthGuard! error.

Vi el post reciente con el mismo problema que el mío ( NoProviderError usando canActivate en Angular 2), pero para mí el guardia está arrancado correctamente hasta el principal.ts , por lo que mi enrutador debe saber qué rutas deben proporcionarse con el AuthGuard correcto ?

Cualquier ayuda o consejo sería muy apreciado. ¡Gracias!

Author: Alex Beugnet, 2016-07-05

10 answers

Tuve este mismo problema después de pasar por la sección de Guardias de ruta del tutorial de Enrutamiento y Autorización en el sitio web Angular https://angular.io/docs/ts/latest/guide/router.html , es la sección 5.

Estoy agregando AuthGuard a una de mis rutas principales y no a rutas secundarias como muestra el tutorial.

Lo arreglé al agregar AuthGuard a mi lista de proveedores en mi aplicación.módulo.ts archivo, por lo que el archivo ahora se ve así:

import { AppComponent } from './app.component';
import {AppRoutingModule} from './app-routing.module';
import {AuthGuard} from './auth-gaurd.service';

import { AnotherPageComponent } from './another-page/another-page.component';
import { LoginPageComponent } from './login-page/login-page.component';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    JsonpModule,
    AppRoutingModule,
    HttpModule
  ],
  declarations: [
    AppComponent,
    LoginPageComponent,
    AnotherPageComponent
  ],
  providers: [AuthGuard],
  bootstrap: [AppComponent]
})

export class AppModule { }

He vuelto a través de la tutorial y en su aplicación.módulo.archivo ts, no agregan AuthGuard a los proveedores, no estoy seguro de por qué.

 49
Author: Dan Stirling-Talbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-21 15:19:49

Además, no caigas en la trampa de usar un literal para la clase guard dentro de tu configuración de enrutamiento, solo porque algunos artículos de blog lo hacen:

{ path: 'whatever', component: WhatEverComponent, canActivate: ['WhatEverGuard'] }

No va a funcionar (No provider for...), en su lugar, use la clase directamente:

{ path: 'whatever', component: WhatEverComponent, canActivate: [WhatEverGuard] }

Otra sugerencia, cuando componentes de carga lenta, el guardia se aplica en la configuración de enrutamiento del componente padre, no en la configuración de enrutamiento del componente de carga lenta.

 14
Author: Thorsten Westheider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 07:27:51

Para aquellos que todavía tienen este error, no olvide incluir su servicio o clase AuthGuard en la función principal de bootstrap. Y no olvide importar este servicio antes de que se ejecute bootstrap.

import { bootstrap } from '@angular/platform-browser-dynamic';

import { AppComponent } from './app.component';
import { AuthGuard } from './shared/auth.service';

bootstrap(AppComponent, [
  appRouterProviders,
  AuthGuard
]);

El equipo de Angular 2 no mencionó esto en los documentos principales del enrutador, y me tomó un par de horas averiguarlo.

 9
Author: Roman Gusiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 17:13:59

En realidad, solo fue un error tipográfico en una importación...

Estaba escribiendo

Importa { AuthGuard} desde './../Autenticación/auth.guardia';

En lugar de

Importa { AuthGuard} desde './../autenticación/auth.guardia';

Por lo que no funciona, pero al mismo tiempo no me muestra ningún error...

(cara triste)

 5
Author: Alex Beugnet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-05 14:08:41

La respuesta está más abajo en el tutorial. Vea los listados de archivos en el tema "Agregar el LoginComponent" bajo el tema " Ruta sin componentes:..."section in "Milestone 5: Route Guards"(en inglés). Muestra AuthGuard y AuthService siendo importados y agregados a la matriz de proveedores en login-routing.módulo.ts, y luego ese módulo que se importa en la aplicación.módulo.ts.

Login-routing.módulo.ts

  ...
    import { AuthGuard }            from './auth-guard.service';
    import { AuthService }          from './auth.service';
    ...
    @NgModule({
    ...
      providers: [
        AuthGuard,
        AuthService
      ]
    })
    export class LoginRoutingModule {}

App.módulo.ts

import { LoginRoutingModule }      from './login-routing.module';

@NgModule({
  imports: [
    ...
    LoginRoutingModule,
    ...    
  ],
  ...
  providers: [
    DialogService
  ],
  ...
 5
Author: unqualified,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 21:33:30

Me encontré con este problema cuando estaba siguiendo un tutorial. He intentado la mayor parte de la respuesta aquí, pero no conseguir ningún éxito. Entonces probé la manera tonta como poner el AuthGuard antes que los otros servicios en el proveedor y funciona.

// app.module.ts

 .. 
 providers: [
   AuthGuard,
   UserService,
   ProjectService
  ]
 2
Author: christian crisologo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-27 06:13:38

Ya que obtuvo la solución, ya que se debió a un problema de sintaxis. Solo quería compartir esta información.

Necesitamos proporcionar el AuthGaudSerivce como proveedor solo en ese módulo que corresponda a la ruta respectiva. No es necesario proporcionar en el módulo principal o el módulo raíz, ya que el módulo principal cargará automáticamente todo el módulo secundario dado.Esto ayuda a mantener el código modular y encapsulado.

Por ejemplo, supongamos que tenemos el siguiente escenario

1. we have module m1
2. we have route m1r in module m1
3. route m1r has 2 route r1 and r2
4. we want to protect r1 using authGaurd
5. finally we have main module that is dependent on sub module m1 

A continuación es sólo prototipo, no el código real para comprender el propósito

//m1.ts    
import {AuthGaurd} from './auth.gaurd.service'
import {m1r} from './m1r'
    @NgModule(
     imports: [m1r],
     providers: [AuthGaurd]
    )
    export class m1{
    }

//m1r.ts
import {AuthGaurd} from './auth.gaurd.service'
const authRoute = [
 {path: '/r1', component: 'authComponent', canActivate: [AuthGaurd]},
 {path: '/r2', component: 'other'}
]
export authRoute

//main.module.ts
import {m1} from ''
import {mainComponent} from ''
@NgModule({
  imports: [m1],
  bootstrap: [mainComponent]
  })
export class MainModule{}    
 1
Author: Vikash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-22 07:54:18
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private router: Router) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        if (localStorage.getItem('currentUser')) {
            // logged in so return true
            return true;
        }

        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
        return false;
    }
}
 1
Author: Shailesh kala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-28 09:01:55

Importar tanto HttpModule como HttpClientModule me ayudó.

import { HttpClientModule } from '@angular/common/http'; 
import { HttpModule } from '@angular/http';
 1
Author: Ramya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 16:07:32

Puede intentar importar AuthGuard en el proveedor de ese módulo y luego importarlo en el componente de enrutamiento-enrutamiento.módulo.ts file also

@NgModule({
providers: [
    AuthGuard
  ],})
 0
Author: VISHNU Radhakrishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 07:11:05