authentication - 在 Angular2 rc3 中是否有比守卫更全面的方法来处理身份验证?

标签 authentication angular angular2-routing angular2-router3

我有一个现有的 Angular2 应用程序,其中通过创建扩展 RouterOutletAuthRouterOutletDirective 来处理登录/身份验证。这使得在激活函数中使用 componentInstruction 来检查用户是否登录变得容易,如果没有将他们重定向到我们的登录门户(出于各种原因我无法通过单独的应用程序控制它,它有自己的登录屏幕,然后在导航到下一个组件之前发回我们将保存在 Angular2 应用程序中的 token 。

我刚刚升级到路由器 3.0.0-alpha.8,我发现这不再是一个选项,它已被创建一个 authGuard 并使用 canActivate 方法来处理身份验证(我指的是 documentation 的这一部分)。我正在努力解决的问题是,这似乎是为只有少量路由受到保护的应用程序设计的,您只需将 canActivate: [AuthGuard] 添加到每个需要身份验证的路由路由器配置。

我遇到的问题是每条路由都需要通过身份验证来保护。还需要持续检查(除非有更好的解决方案),因为我们也会(部分原因是我们必须使用外部登录服务)注销用户并清除他们的 token ,下次您导航到新路线(无论路线是什么)它应该重定向您再次登录。我知道我可以将 canActivate: [AuthGuard] 添加到每条路由,但这似乎是一个疯狂而乏味的修复,特别是对于具有大量路由的应用程序,所有这些都需要用户被验证以查看。

我一直在寻找修复方法,但似乎(可能部分是因为升级是相当新的)所有资源都用于如何在一两个路由上实现这些 AuthGuard。我一直在挖掘源代码(特别是 here ),看看是否有另一种方法可以扩展,它比 canActivate 更全面,或者更通用的方法让每条路线都包含一个特定的守卫但我似乎找不到任何东西。非常感谢任何关于如何最好地实现这一点的建议!谢谢。

最佳答案

引用我的评论,你可以像这样添加额外的保护:

import {provideRouter, RouterConfig, Route, CanActivate, ActivatedRouteSnapshot} from '@angular/router';
import {Injectable} from "@angular/core";

@Injectable()
class UniversalGuard implements CanActivate {
    canActivate(route: ActivatedRouteSnapshot) {
        console.log('applying can activate');
        return true;
    }
}

let routes: RouterConfig = [
    {path: 'path1', component: Component1} as Route,
    {path: 'path2', component: Component2} as Route,
    {path: 'path3', component: Component3} as Route
];

const routeAugumenter = route => {
    let guards = route.canActivate || [];
    guards.push(UniversalGuard);

    route.canActivate = guards;

    if (route.children) {
        route.children = route.children.map(routeAugumenter);
    }

    return route;
};

let augumentedRoutes = routes.map(routeAugumenter);

console.log(augumentedRoutes);

export const APP_ROUTER_PROVIDERS = [
    provideRouter(augumentedRoutes), UniversalGuard
];

我没有用子路由测试过它,但应该也能正常工作。

编辑:更新了如何将服务注入(inject) UniversalGuard 的信息。

如果你的守卫需要注入(inject)一些服务,你可以像往常一样在构造函数中注入(inject)它们。您必须在 Angular Bootstrap 调用中而不是在组件中提供这些服务(以及它们所依赖的服务等)。

关于authentication - 在 Angular2 rc3 中是否有比守卫更全面的方法来处理身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38152049/

相关文章:

python - Django - 使用redirect_to_login

angular - 在页面之间导航时未调用 ngAfterViewInit

Angular2如何在保持路线的同时显示错误页面

Angular 2 : Route generator for '...' was not included in parameters passed

authentication - Haskell 独立桌面应用程序身份验证(使用 google/facebook/twitter/etc 帐户)

php - 网站只需一次登录

javascript - Angular Material 选项卡中选项卡内容的受控渲染

angular - 如何反射(reflect)组件从一个页面到另一个页面的变化

javascript - 从路由Angular中的子组件加载触发父组件中的事件

mongodb - 如何在 Linux 中禁用对 MongoDB 3.0.x 的匿名访问