Angular 2路线角色守卫

时间:2016-09-06 13:34:49

标签: angular angular2-routing

现在我正在使用angular2 rc.4。但在不久的将来,我会将我的应用更新到rc.6。

我的任务是确定活动路由,我想在后台按用户角色/类型/任何方式实现路由保护。

我的应用程序对所有用户开放,另一个应用程序是后台。

后台的一些路线:

{
    path: "proposal",
    component: ProposalCmp,
    data: {
        authList: [
            ROLES_DATA.ADMIN,
        ]
    }
},
{
    path: "proposal/:id",
    component: ProposalCmp,
    data: {
        authList: [
            ROLES_DATA.ADMIN,
            ROLES_DATA.CUSTOMER
        ]
    }
},

在应用程序初始化阶段,路由由authList角色过滤,以防止在动态菜单上显示所有链接。如果某种类型的用户不应该看到它,它就不会显示,并且工作正常。

但是在第一次加载(重新加载页面)时,我遇到了一些问题。例如,如果我以customer身份登录,则只能查看proposal/:idproposal

所以我决定写路线卫士:

@Injectable()
export class RouteGuard implements CanActivate {
    constructor(private tokenService: TokenService,
                private router: Router,
                private activatedRoute: ActivatedRoute) {
    }

    public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
        // this.router.isActive(url=string|UrlTree, exact=true)
        // released in rc.5 - https://github.com/angular/angular/blob/2.0.0-rc.5/modules/%40angular/router/src/router.ts#L328
        console.log(state.url, this.router.url);

        return true;
    }
}

最后,在第一页加载(重新加载页面)时,我只能从state.url获取正确的网址,route对象似乎默认值初始化,route.data为空route.url

如果已加载应用并激活其他路线,例如,点击链接,我会在route.data方法中获得正确的canActive()

好吧,我可以导入所有路由的数组并通过它们,但是我如何解析路径路径proposal/:id并将其与proposal/6进行比较,我可以从{{1}获取}}?我还没有使用过它很好,但如果我愿意的话。我现在可以使用正则表达式,但我不认为这是未来的好选择。

我发现了类似的问题 - Angular 2 routes current url with params

问题是:

  • 为什么我无法在应用加载时获取当前激活的路由快照,如何检测它? state.url或其他订阅不起作用。
  • 如何以正确的方式将ActivatedRoute.url.subscribe()中的proposal/6与我的路径state.url进行比较?
  • 或者可能还有其他选择如何检测有效路线,甚至是另一种解决方案?

0 个答案:

没有答案