我目前正在使用Angular 6进行一个小项目,以练习一些客户端-服务器交互,这是一个简单的博客样式的网站,用户可以在其中查看其他人的帖子并自己撰写。到目前为止,我已经解决了JWT身份验证和路由防护问题,以防止未登录的用户查看受保护的资源。
项目当前的结构方式是使每个用户都有一个ProfilePage
组件显示的用户个人资料。在我的路由器中,我导航到结构为/user/:username
的正确用户页面,其中:username
是服务器将为其发送回适当数据的特定用户页面。我要解决的问题是如何做到这一点,以便登录其帐户的用户只能在其个人资料页面上添加和删除帖子,而不能在其他人的页面上添加和删除帖子。
我已经阅读了用户权限和角色,但是,如果两个用户都具有“ USER”角色,那么如何区分用户是否在查看他们的页面?
我有一些想法:
在用户导航到页面时动态检查页面上的权限,因此我将向服务器发送请求(带有JWT承载),并且它将向后发送页面的用户/编辑者角色状态,然后用户发布内容时,服务器会再次验证是否允许用户发布内容,然后才能在后端进行实际更改。
我的另一个想法是制作一个单独的MyProfile组件,该组件的行为,外观和感觉类似于用户个人资料,但带有编辑器按钮除外。我可以看到的问题是,当我实现一个ADMIN角色时,我可能会遇到麻烦,该角色可以删除任何用户的帖子(出于教育目的,不包括道德问题)。
类似于第一个想法,但是当用户登录时,请记下其用户名,然后仅在客户端检查该权限,然后在他们实际发布/删除帖子以确认他们是用户时在服务器端检查权限实际上允许这样做。
这些选项中的任何一个似乎都是前进的可行方法吗?如果我仍然可以通过Guard进行此操作,怎么办?
答案 0 :(得分:0)
我将为您解决3。
实际上,您甚至不需要在用户登录时存储用户名。当您在应用程序中采用JWT授权时,应改为存储JWT令牌(如果登录时已在Cookie中设置了JWT令牌,则甚至不需要手动存储它)。
您的JWT令牌应包含有关用户的非常基本的信息(也许是用户名或UUID,以及您认为合适的其他信息)以及令牌信息。当用户访问个人资料页面时,您应该使用此JWT令牌从后端检索用户信息。 (即,将此JWT承载令牌附加到授权标头中,或将其包含在cookie中。您的后端应读取此JWT令牌并检索唯一标识符(如建议的用户名/ uuid)以检索用户信息)
当用户即将更新用户信息时,您应再次附加JWT承载令牌,后端应根据需要使请求无效。
我还建议只为常规用户启用int a = ...
int b = ...
int quotient = a / b;
int remainder = a % b;
路由或类似/user
的路由。管理员说,/myprofile
路线仅向有权查看他人资料的人员开放。
答案 1 :(得分:0)
我会将用户自己的个人资料页面放在自己的路线中,而不是与其他人的路线相同。这样,您可以在个人专用配置文件页面上提供所有安全性(服务器端),而其他人的配置文件页面将是公开页面,剥夺了任何编辑,删除,添加等方式。