使用 PHP 在 Angular2 中设置自定义 AuthGuard

Setting up a custom AuthGuard in Angular2 using PHP

我是 Angular2 的新手,目前正在学习。

这是我项目中的文件夹结构。

var/www/html/
        |_(angproject)
                |_(phpscript)
                |       |_login.php
                |_(src)
                   |_(app)
                        |_(admin)
                        |   |_(login)
                        |   |   |_login.component.ts
                        |   |
                        |   |_admin.component.ts
                        |
                        |_(_admin_service)
                        |       |_admin.login.ts
                        |
                        |_(_animations)
                        |
                        |_(front)
                        |
                        |_(_models)
                        |   |_admin.model.ts
                        |
                        |_(_authguard)
                        |   |_adminauth.guard.ts
                        |
                        |_app.adminroute.ts
                        |_app.module.ts

这是我的app.adminroute.ts文件:-

import { RouterModule, Routes } from '@angular/router';
import { APP_BASE_HREF } from '@angular/common';
import { CanActivate } from "@angular/router";

import { AdminComponent } from './admin/admin.component';
import { LoginComponent } from './admin/login/login.component';
import { DashboardComponent } from './admin/dashboard/dashboard.component';

import { AdminAuthGuard } from './_authguard/adminauth.guard';


export const appAdminRoutes: Routes = [
  { path: 'admin',
    component: AdminComponent,
    children: [
          { path: '', component: LoginComponent},
          { path: 'dashboard', component: DashboardComponent, canActivate: [AdminAuthGuard] }
    ]
  }
];

在我的 login.component.ts 文件中,我将管理员的 id 存储在本地存储中:-

submitPost()
  {        
      this._adminLogin.postAdminLogin(this.adminLoginmodel).subscribe(
          data => {
                this.responseStatus = data;
                if(this.responseStatus.status == 1)
                {
                  localStorage.setItem('admin_id', this.responseStatus.detail.id);
                  //console.log(localStorage.getItem("admin_id"));
                  this.router.navigate(['admin/dashboard'])
                }
                else
                {
                  alert('Login Error');
                }
              },
          err => {
                console.log(err)
              },
          () => {}
      ); 
      this.status = true;       
  }

这是我的adminauth.guard.ts文件:-

import { Http, Response, Headers, RequestOptions} from '@angular/http';
import { HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/share';

@Injectable()
export class AdminAuthGuard {
    http : Http;
    actionUrl : string;
    admin_auth_Url: string;
    adminAuthResponse:Object= []; 


    constructor(public _http: Http) {
       this.http = _http;
       this.admin_auth_Url = 'http://localhost/angproject/phpscript/isadminlogin.php';
    }
    checkAdminAuth() {
        let headers = new Headers();
        headers.append("Accept", "q=0.8;application/json;q=0.9");
        this.actionUrl = this.admin_auth_Url;
        return this.http.post(this.actionUrl, 
                                    {admin_id:localStorage.getItem("admin_id")}, 
                                    { headers: headers })
                                .map(res => res.json()).share();
    }
}

函数 checkAdminAuth() 调用一个 php 文件,该文件 returns 以下列方式响应数据:-

{"status":0,"message":"Message comes here","error":}

每当我尝试访问仪表板页面时,checkAdminAuth() 函数必须点击 php 文件来检查身份验证。如果响应状态为0,它将重定向到http://localhost:4200/admin。如果状态是 1,它应该导致 http://localhost:4200/admin/dashboard.

如何触发 checkAdminAuth 函数来获取响应并执行重定向?

您的 AdminAuthGuard 应该实现 CanActivate 接口。它有一个方法 canActivate,它应该包含你在 checkAdminAuth 中的内容。否则它永远不会在路由时被调用。此外 canActivate 应该 return BooleanPromise<Boolean>Observable<Boolean> 所以你应该将你的结果映射到 return 它。

您想要实现的条件重新路由可以在 AdminAuthGuard 中完成,就像这样

canActivate() {
    if (/*user is logged in*/) {
        this.router.navigate(['/admin']);
        return true;
    }
    else {
        this.router.navigate(['/dashboard']);
    }
    return false;
}