【发布时间】:2019-04-17 19:51:58
【问题描述】:
我正在使用 Angular 7 开始一个项目,我想知道根据权限向用户隐藏“受保护”HTML 元素的最佳方法是什么。我知道最简单的方法是使用像 CASL 这样的库来处理它们,但我想要真正的权限/角色访问检查。
如果用户不应该看到一个按钮,它就不能被渲染,我知道 ngIf 和 ngShow,即使它不会到达 HTML,它也会出现在缩小的 bundle.js 中。
我的方法是使用 Angular Universal 并使用 isPlatformBrowser 和 isPlatformServer 进行一些测试,但我发现即使我使用类似以下的内容,当 Angular 在客户端引导时,代码仍然会出现在包中:
<ng-container *ngIf="isPlatformServerFunction() && hasAccess()">
<button> Secret Button </button>
<ng-container>
¿有没有办法只在服务器端渲染某些东西,并且在服务器端渲染之后引导 HTML/JS 时不要让 HTML/JS 滑入前端?
我想知道这在 Facebook 等大型应用程序中是如何处理的,因为每个人都说它应该在前端,因为后端 API 是安全的,所以如果他们到达 UI,他们就赢了'无论如何都无法获取 API 的数据,但我在 Facebook 的公共包中看不到管理按钮/代码。
【问题讨论】:
-
为什么不评估代码服务器端,甚至不让它到达客户端?
-
在像 facebook 这样的网站中,每个人都有一个令牌,其中包含他们所有的访问权限(并存储在后端),没有它你不能做任何事情,包括管理员请求,所以在你的情况下假设你正在做一些带有凭据的请求(为什么不),那么您将创建一个后端接口,该接口或多或少地通过了请求,但添加了凭据,只有在您授权通过令牌调用该接口时才能调用。
-
关于令牌系统的更多信息(最好使用 3rd 方系统)基本上你有一个登录请求到后端,它生成一个随机令牌或编码的详细信息,没有任何安全凭据并保存用户信息在数据库中使用该令牌(最好带有时间戳)然后将该令牌提供给前端,当用户尝试访问该界面时,您检查他是否向您传递了一个令牌并检查它是否存在于数据库中并连接到用户具有必要的权利(如果它在一个时间范围内),然后发送请求
-
永远记住你在前端代码中“隐藏”的任何东西都可以通过开发者控制台中的简单控制台输入和网络日志功能的一点帮助来重现
-
感谢您的见解和分享您在安全和 Facebook 方面的知识。这个想法实际上是不让代码到达客户端,而是让服务器渲染它并且不要让它滑到 JS 包中,如果可能的话,这在 PHP 中很容易,因为你决定渲染与否基于简单的条件,但在 SPA 中并不那么容易,因为有一个捆绑包正在创建和发送。在 SPA + SSR 方面,如果您想要相同的效果,那么也许我应该删除 bundle 中的 JS Angular 函数,但这应该在运行时完成,根据用户角色,这就是这里的复杂性
标签: javascript html angular angular-universal server-side-rendering