0

我的所有路线上都有 CanActivate 警卫,它们正在故障转移。

例如,我有两个警卫:

export class AuthenticationGuard implements CanActivate {
    constructor(private as: AuthenticationService, private router: Router) { }

    canActivate() {
        if (this.as.isLoggedIn()) {
            return true;
        }

        this.router.navigate(['/login']);

        return false;
     }
    }

export class IsAdminGuard implements CanActivate {
    constructor(private us: UserService, private router: Router) { }

    canActivate() {
        if (this.us.isAdmin()) {
            return true;
        }

        this.router.navigate(['/home']);

        return false;
    }
}

还有我的路线守卫

const routes: Routes = [
    {
        path: 'home',
        component: DashboardComponent,
        canActivate: [AuthenticationGuard, IsAdminGuard]
    }
];

@NgModule({
    imports: [ RouterModule.forRoot(routes) ],
    exports: [ RouterModule ]
});

发生的情况是,如果AuthenticationGuard失败,它有时会检查IsAdminGuard,而不是在某人/login未经过身份验证时将其路由到,而是/home将他们发送到另一个错误页面,因为他们未经过身份验证并且不是管理员,警卫应该有在第一次失败时将他们踢出局。

AuthenticationService如果我删除了在调用时检查的身份验证 jwt isLoggedIn(),刷新/home路由并可以跟踪AuthenticationGuard返回false仍在调用,我可以 100% 重现该问题IsAdminGuard

这是代码isLoggedIn()

isLoggedIn = () => {
    const token = this.get();
    const decoded = this.decode(token);

    return token && this.isNotExpired(decoded);
};  

decode = (token: string) => {
    const validToken = () => parts.length < 3
    const parts = token ? token.split('.') : '';

    if (!token || validToken()) {
        return '{}';
    }

    const payload = validToken() ? parts[1] : '{}';

    return JSON.parse(atob(payload));
};

private isNotExpired = (decodedToken) => this.getExpiryFrom(decodedToken) > new Date();

private getExpiryFrom = (decodedToken) => new Date(decodedToken.exp * 1000);

想法?

4

1 回答 1

1

考虑对重新检查身份验证状态的 isAdmin 保护进行短路。这样,身份验证的真实性将永远不会被您的 isAdmin 真实性结果所覆盖。它可能看起来多余,但它会起作用。

于 2018-11-27T16:52:13.120 回答