我在离子中使用身份验证守卫。这是我正在使用 canload 的 auth guads 服务中的代码
import { Injectable } from '@angular/core';
import { CanLoad } from '@angular/router';
import { AuthenticationService } from './Authentication.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuardService implements CanLoad {
constructor(
public authenticationService: AuthenticationService,
) { }
canLoad(): boolean {
return this.authenticationService.isAuthenticated();
}
}
这是验证服务中的代码。它正在检查用户是否已登录,如果已登录,则状态为真
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Storage } from '@ionic/storage';
import { ToastController, Platform } from '@ionic/angular';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthenticationService {
authState = new BehaviorSubject(false);
constructor(
private router: Router,
private storage: Storage,
private platform: Platform,
public toastController: ToastController
) {
this.platform.ready().then(() => {
this.ifLoggedIn();
});
}
ifLoggedIn() {
this.storage.get('user_id').then((response) => {
if (response) {
this.authState.next(true);
}
});
}
logout() {
this.storage.remove('user_id').then(() => {
this.router.navigate(['/login'])
this.authState.next(false);
});
}
isAuthenticated() {
return this.authState.value;
}
}
这是 app.routing.module.ts 中的代码。在这里,我使用 canload auth 保护,但它不让打开屏幕。当我删除 canLoad: [AuthGuard] 时,它可以正常工作,但是如果我单击应用程序中的后退按钮,它会返回登录页面。
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { AuthGuardService as AuthGuard } from './services/auth-guard.service';
const routes: Routes = [
// {
// path: '',
// loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
// },
{
path: 'native-player',
loadChildren: () => import('./native-player/native-player.module').then(m => m.NativePlayerPageModule)
},
{
path: 'signup',
loadChildren: () => import('./signup/signup.module').then(m => m.SignupPageModule),
canLoad: [AuthGuard]
},
{
path: 'login',
loadChildren: () => import('./login/login.module').then(m => m.LoginPageModule),
canLoad: [AuthGuard]
},
{
path: 'recent-broadcasts',
loadChildren: () => import('./recent-broadcasts/recent-broadcasts.module').then(m => m.RecentBroadcastsPageModule),
canLoad: [AuthGuard]
},
{
path: 'broadcaster',
loadChildren: () => import('./broadcaster/broadcaster.module').then(m => m.BroadcasterPageModule),
canLoad: [AuthGuard]
},
{
path: 'questionnaire',
loadChildren: () => import('./questionnaire/questionnaire.module').then(m => m.QuestionnairePageModule),
canLoad: [AuthGuard]
},
{
path: 'dropdown',
loadChildren: () => import('./dropdown/dropdown.module').then( m => m.DropdownPageModule)
}
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
这是 app.module.ts 中的代码,我在其中添加了离子存储、authguard 服务和身份验证服务
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HttpClientModule } from '@angular/common/http';
// import { Storage } from '@ionic/storage';
import { IonicStorageModule } from '@ionic/storage';
import { AuthGuardService } from './services/auth-guard.service';
import { AuthenticationService } from './services/Authentication.service';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule, HttpClientModule, IonicStorageModule.forRoot(),],
providers: [
StatusBar,
SplashScreen,
AuthGuardService,
AuthenticationService,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule { }
我的 ionic cli 是 5.4.16,框架是 @ionic/angular 5.2.3