What I'm using
-
Angular
-
Firebase
What I'm trying to achieve
- 根据条件执行路由器重定向的Auth Guard
Where I've got to
- 我在许多组件上都有一个auth防护,如果用户有一个书签(例如......)来记录并导航到它而未登录,它们将被推回到登录页面 .
Question
- 是否可以修改我的auth guard,以便在用户登录时,但以某种方式设法导航到'www.mydomain.com/login',它们被重定向到指定的路由?
My Route Guard
我已经把注释掉的代码留给了我尝试过的逻辑 . 这里的问题是,如果我使用注释掉的代码,如果用户没有登录,它最终会重定向回到你已经登录的登录页面 .
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate, Router } from '@angular/router';
import { AuthService } from './auth.service';
//testing
import { Observable } from 'rxjs/Observable';
import { AngularFireAuth } from 'angularfire2/auth';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/take';
import 'rxjs/add/operator/do';
@Injectable()
export class AuthGuardService implements CanActivate {
constructor(
private authService: AuthService,
private router: Router,
private auth: AngularFireAuth
) { }
canActivate(): Observable<boolean> {
return this.auth.authState
.take(1)
.map(authState => !!authState)
.do(auth => !auth ? this.router.navigate(['/login']) : true);
}
// canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
// return this.checkLoggedIn(state.url);
// }
// checkLoggedIn(url: string) {
// if (this.authService.isLoggedIn()) {
// console.log("yup, i'm logged in!");
// return true;
// } else {
// this.router.navigate(['/login']);
// console.log("nop, i'm not logged in!");
// return false;
// }
// }
}
Example of auth guard on a route
理想情况下,我想在我的身份验证中使用一些逻辑,这意味着我可以在登录路线上执行相同的操作
{
path: 'folders',
component: FolderListComponent,
resolve: { folderListData: FolderListResolver },
canActivate: [AuthGuardService]
},
UPDATE 感谢@Vega更近一点 . 现在发生了什么:
-
登录页面>登录>重定向到正确的页面=太棒了!
-
导航到登录之外的任何页面,但未登录=重定向回登录页面=太棒了!
-
登录= Stuck时导航到登录屏幕 . 它现在认为用户没有登录=这需要修复
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let newUrl = state.url;
if (newUrl === "/login") {
if (this.authService.isLoggedIn()) {
console.log('Login Page / Signed In');
return false;
}
else {
console.log('Login Page / Not Signed In');
return true;
}
}
else {
if (this.authService.isLoggedIn()) {
console.log('Other Page / Signed In');
return true
} else {
this.router.navigate(['/login']);
console.log('Other Page / Not Signed In');
return false;
}
}
}
1 回答
UPDATE: 这可能不是更优雅的方式,但它有效,而且代码更少:
Old answer:
在主要组成部分:
或类似以下内容:
和
在AnOtherGuard中