ich einen Winkel 2-Anwendung habe, in dem ich muß auf jeder Seite authentifiziert werden. Also habe ich ein benutzerdefiniertes RouterOutlet implementiert, um zu bestätigen, dass ich bei jedem Seitenwechsel angemeldet bin.Angular 2-Authentifizierung mit Kind Routen
@Directive({
selector: 'auth-outlet'
})
export class AuthOutlet extends RouterOutlet {
publicRoutes: any;
private parentRouter: Router;
private authService: AuthService;
constructor(_elementRef: ElementRef,
_loader: DynamicComponentLoader,
_parentRouter: Router,
@Attribute('name') nameAttr: string,
_authService: AuthService) {
super(_elementRef, _loader, _parentRouter, nameAttr);
this.parentRouter = _parentRouter;
this.authService = _authService;
this.publicRoutes = {
'Login': true
};
}
activate(oldInstruction: ComponentInstruction) {
var url = this.parentRouter.lastNavigationAttempt;
console.log('attemping to nav');
if (!this.publicRoutes[url] && !this.authService.loggedIn){
var newInstruction = new ComponentInstruction('Login', [], new RouteData(), Login, false, 1);
return super.activate(newInstruction);
} else {
return super.activate(oldInstruction);
}
}
}
Hier ist ein funktionierendes Code: http://plnkr.co/edit/YnQv7Mh9Lxc0l0dgAo7B?p=preview
Gibt es einen besseren Weg, Routenänderungen abzufangen und für die Anmeldung umleiten, wenn der Benutzer nicht authentifiziert ist?
Superb !! Was brauchst du noch !! – micronyks
Nun, für eine Sache sollten Sie nicht eine ComponentInstruction neu erstellen. Das hat also schon Probleme. Außerdem treten Probleme auf, wenn Sie sich in einer untergeordneten Route befinden, die nicht über die Anmeldungsroute informiert ist. (Ich arbeitete an diesem Problem mit dem Poster) –
Wenn jemand tief mit der Seite verlinkt, wird der Server beteiligt und Sie machen eine Authentifizierung auf dem Server. Wenn jemand autorisiert ist, gelangen Sie in Ihre App. Sobald sie sich in Ihrer App befinden, können sie sich frei bewegen. Der Browser und js sollten hier keine Auth-Checks machen, der Server sollte. –