javascript - 当你需要在Angular8中通过导航将数据传递给另一个组件时,最安全和最有效的方法是什么?
问题描述
我目前正在开发一个基于用户身份验证的应用程序,每个用户都可以将学生校园注册为教师,目前,我正在开发一个有两条路线的功能:
路线 1:它有一个数据网格,我在其中列出了我已经创建的所有学生校园,并且每一行都有一个编辑按钮,可以导航到“路线 2”,其目的是编辑已经创建的学生校园.
路线 2:它有一个表格,其中包含创建学生校园的所有必要字段。
如您所见,我需要传递学生校园 ID 以在 ngOnInit 中获取数据以填充字段并能够编辑上述内容,因此我有几个选项可供考虑:
选项 1:在 URL 中传递 ID。
this.router.navigate(['planteles/registrar', idPlantel]);
https://myapplication/planteles/registrar/1
选项 2:使用 queryParams 在 URL 中传递 ID。
this.router.navigate(['planteles/registrar'], { queryParams: { ID: idPlantel } });
https://myapplication/planteles/registrar?ID=1
选项 3:在导航附加组件的状态对象中传递 ID。
this.router.navigate(['planteles/registrar'], { state: { id: idPlantel } });
选项 4:共享服务和 BehaviorSubject 订阅数据。
I owe you the code
我可以使用其中的任何一个,但我对它们中的每一个都有问题。
我不能使用选项 1 和选项 2,因为老师无法更改 ID,因为这使他有可能获取另一位老师的学生校园数据并进行编辑,因此不安全。选项 3 和选项 4 的问题是当我刷新页面时状态丢失。
目前,我有一个选项 3 的解决方法,如果状态未定义但我不喜欢该解决方案,则将用户重定向到上一页。如果用户在不使用 LocalStorage 的情况下重新加载页面,我想保留数据。
在此先感谢,非常感谢所有帮助或贡献。
解决方案
选项 1 在这里是正确的选项(您会发现现实世界中大多数网站的实现方式......包括我们现在正在使用的这个)。问题在于您的网络安全方法,而您需要修复的是您的后端。您正在接近网络安全,就好像前端安全是真实的,但事实并非如此。Web 安全存在于您的后端。用户不应该能够获取或查看或操作不属于他们的数据,这必须由您的后端强制执行。
这是如何工作的高级示例:当用户登录时应该授予一些安全的身份验证令牌,然后这个身份验证令牌应该附加到每个请求。然后 API 使用此令牌来检查发出请求的用户并确保他们具有适当的权限。如果他们没有(比如用户将他们的 URL 参数编辑为他们没有权限的某个 ID)或者没有令牌,API 应该返回 401 或 403 响应,并且前端应该适当地处理它(即,将它们发送回列表,或显示错误页面,无论您决定如何)...如何发行此令牌,使其安全并使用它是一个完全独立的主题,超出了此答案的范围。
在任何选项中,我都可以打开我的开发工具,查看正在发出的任何 API 请求,并更改 ID 并使用它来查看或操作其他人的数据,而无需任何努力。所以选项 3 / 4 几乎不比 1 或 2 更“安全”。如果没有正确实施的后端安全性,这些都不安全。
前端“安全”仅作为用户体验存在。我和您都使用相同的 URL 来查看此页面,但我们看到不同的选项和按钮,例如您可以编辑或删除您的帖子并接受答案,而我不能,但我可以编辑或删除我的答案等。这不是出于真正的安全目的,SO 的服务器强制执行谁可以和不可以采取什么行动。它只是向我和你展示反映我们不同权限的 UI,即,它只是 UX。
推荐阅读
- r - 如何在 R 中的主题比较中进行双向重复?
- powershell - Powershell bigint 输出与声明值不同
- git - 如何使用最新的 master 更新我的合并提交?
- angular - 列表滚动上的 Nativescript 隐藏工具栏 - 保留标签
- excel - 当交叉点处的值与条件匹配时如何查找列名和行名的值
- c# - 如何使用 XAML 中的条件修复 multiBinding 中的 StringFormat
- javascript - 如何将数据传递给另一个函数 | 要求('请求')
- windows - 如何从 RichEdit 中清除“临时”(tomApplyTmp) 格式?
- docker - docker compose 卷类型 - 绑定与卷
- redis - 在 Airflow 的不同机器上运行一个 DAG 的多个任务