2017-02-15 36 views
5

我开发我有一个用户区和管理区的应用程序。我已将这些分离为独立的Angular 2模块。我已经成功实现了延迟加载,因此只有在用户请求'/ admin'时才能加载管理模块。安全地护卫懒加载模块(角2)

从角2文档,我看到,我可以指定一个 “canLoad” 后卫,像这样:

{ 
    path: 'admin', 
    loadChildren: 'app/admin/admin.module#AdminModule', 
    canLoad: [AdminGuard] 
    } 

和实施AdminGuard类中的函数canLoad像这样:

canLoad(route: Route): boolean { 
    return this.authService.isAdmin(); 
} 

(其中isAdmin()可以对后端API的调用这将返回当前用户或类似的东西)的作用

但是,这实际上阻止任何非管理员从加载AdminModule?除非我误解,否则所有这些代码都位于客户端,那么是否有任何事情可以阻止客户端修改“canLoad”方法,以便始终返回true?像这样:

canLoad(route: Route): boolean { 
    return true; 
} 

因此允许客户端加载他们想要的任何模块。

显然给后端的API,需要管理员状态的任何呼叫都将受到保护,但它似乎是任何用户都可以查看管理界面,这只是似乎有点怪我。有人可以帮我清楚吗?

回答

4

这是一个很大的问题,我很好奇,如果有人确实对此有一个详细的解答。所以我发现这个链接有一个非常好的对话。真正伸出我

Angular 2 Reddit Article

一种意见是这一个。

在SPA中讲话,一般html模板和你的js文件都会在 之外,对于任何人来说都足够关心检查。只是,模板届时将 填充在客户端这样的数据:您的SPA将数据(JSON读)说 到您的服务器。所以你主要关心的是 保护这个API。会话,cookie,令牌,都意味着 仍然有效。我自己使用令牌进行身份验证和授权。 API请求将包含服务器签名令牌,然后将其 验证,并从角色和凭证提取,然后用 确定该用户是否有权作出这样的请求。失败 检查将返回401未经授权的客户端。在角度方面,我们 保存成功登录后收到的令牌,然后将其用于 后续请求。我还解码凭证和角色,并与 它显示用户信息和授权路线。通过CanActivate接口实现的角度守卫角色为 ,您可以链接多个 :{Path:'protected',CanActivate:[LoggedInGuard]},{Path: 'supersecret',CanActivate:[LoggedInGuard,AdminGuard]}。 ..等但客户端(读取:角度)守卫最终是UX的问题,而不是一个 安全手段。一个知识渊博的黑客可以用dev控制台捣乱 变量,或者直接使用appi 调用绕过它。向用户展示发生了什么错误,并在其他地方导航 等等。

+0

这不是真正的问题答案。它确实链接到一个很好的对话。到目前为止,我在这个主题上找到的信息未能确定具有此功能的明确理由,或者无法解决此问题。几分钟前我发布了这个问题:https://stackoverflow.com/questions/47613907/ – BBaysinger