Угловой 7 CanActivate охранников отказав - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 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который отправляет их на другую страницу с ошибкой, потому что они не аутентифицированы и не являются администратором, и охранники должны были выгнать их при первом сбое.

Я могу воспроизвести проблему в 100% случаев, если я удалюjwt аутентификации, который AuthenticationService проверяет, когда он вызывает isLoggedIn(), обновляет маршрут /home и может отслеживать AuthenticationGuard, возвращая false и все еще , вызывая 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);

мыслей?

1 Ответ

0 голосов
/ 27 ноября 2018

Подумайте о работе в коротком замыкании с вашим охранником isAdmin, который перепроверяет статус аутентификации.Таким образом, достоверность аутентификации никогда не будет отвергнута тем, как получается ваша истинность isAdmin.Это может показаться излишним, но это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...