Beschreibung
Die beste Lösung , die ich gefunden habe , ist das außer Kraft zu setzen , XHRBackend
so dass der HTTP - Antwort - Status 401
und 403
führt zu einer bestimmten Aktion.
Wenn Sie Ihre Authentifizierung außerhalb Ihrer Angular-Anwendung durchführen, können Sie eine Aktualisierung der aktuellen Seite erzwingen, sodass Ihr externer Mechanismus ausgelöst wird. Ich beschreibe diese Lösung in der folgenden Implementierung.
Sie können auch an eine Komponente in Ihrer Anwendung weiterleiten, sodass Ihre Angular-Anwendung nicht neu geladen wird.
Implementierung
Winkel> 2.3.0
Dank @mrgoos ist hier eine vereinfachte Lösung für Angular 2.3.0+ aufgrund einer Fehlerbehebung in Angular 2.3.0 (siehe Problem https://github.com/angular/angular/issues/11606 ), die das Http
Modul direkt erweitert .
import { Injectable } from '@angular/core';
import { Request, XHRBackend, RequestOptions, Response, Http, RequestOptionsArgs, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
@Injectable()
export class AuthenticatedHttpService extends Http {
constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return super.request(url, options).catch((error: Response) => {
if ((error.status === 401 || error.status === 403) && (window.location.href.match(/\?/g) || []).length < 2) {
console.log('The authentication session expires or the user is not authorised. Force refresh of the current page.');
window.location.href = window.location.href + '?' + new Date().getMilliseconds();
}
return Observable.throw(error);
});
}
}
Die Moduldatei enthält nur noch den folgenden Anbieter.
providers: [
{ provide: Http, useClass: AuthenticatedHttpService }
]
Eine weitere Lösung, die einen Router und einen externen Authentifizierungsdienst verwendet, wird in der folgenden Übersicht von @mrgoos beschrieben.
Winkel vor 2.3.0
Die folgende Implementierung funktioniert für Angular 2.2.x FINAL
und RxJS 5.0.0-beta.12
.
Es wird zur aktuellen Seite umgeleitet (plus einem Parameter, um eine eindeutige URL zu erhalten und das Caching zu vermeiden), wenn ein HTTP-Code 401 oder 403 zurückgegeben wird.
import { Request, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export class AuthenticationConnectionBackend extends XHRBackend {
constructor(_browserXhr: BrowserXhr, _baseResponseOptions: ResponseOptions, _xsrfStrategy: XSRFStrategy) {
super(_browserXhr, _baseResponseOptions, _xsrfStrategy);
}
createConnection(request: Request) {
let xhrConnection = super.createConnection(request);
xhrConnection.response = xhrConnection.response.catch((error: Response) => {
if ((error.status === 401 || error.status === 403) && (window.location.href.match(/\?/g) || []).length < 2) {
console.log('The authentication session expires or the user is not authorised. Force refresh of the current page.');
window.location.href = window.location.href + '?' + new Date().getMilliseconds();
}
return Observable.throw(error);
});
return xhrConnection;
}
}
mit der folgenden Moduldatei.
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpModule, XHRBackend } from '@angular/http';
import { AppComponent } from './app.component';
import { AuthenticationConnectionBackend } from './authenticated-connection.backend';
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
],
entryComponents: [AppComponent],
imports: [
BrowserModule,
CommonModule,
HttpModule,
],
providers: [
{ provide: XHRBackend, useClass: AuthenticationConnectionBackend },
],
})
export class AppModule {
}