Angular 2+ 角色权限
Angular 2+ Role Permissions
我目前正在使用 Angular 6 制作一个小项目来练习一些客户端-服务器交互,这是一个简单的博客样式网站,用户可以在其中查看其他人的 post 并制作自己的以及。到目前为止,我已经处理了 JWT 身份验证和路由保护,以防止未登录的人查看受保护的资源。
项目当前的结构方式是每个用户都有一个由 ProfilePage
组件显示的用户配置文件。在我的路由器中,我导航到具有结构 /user/:username
的正确用户页面,其中 :username
是服务器将为其发回适当数据的特定用户页面。我要解决的问题是我如何做到这一点,以便登录到他们帐户的用户只能在他们的个人资料页面上添加和删除 posts,而不是其他人的。
我已经阅读了有关用户权限和角色的信息,但是如果两个用户的角色都是 "USER",我如何区分用户是否正在查看他们的页面?
我的一些想法:
当用户导航到页面时动态检查页面上的权限,所以我会向服务器发送请求(使用 JWT 承载),它会发回 user/editor 角色状态对于该页面,然后当用户 post 进行某些操作时,服务器将再次验证是否允许用户 post 在后端实际进行更改之前。
我的另一个想法是制作一个单独的 MyProfile 组件,除了带有编辑器按钮外,它的行为、外观和感觉都像用户配置文件。我可以看到的问题是,当我实现一个可以删除任何用户的 post 的 ADMIN 角色时,我稍后 运行 会遇到麻烦(出于本项目的教育目的,道德除外)。
与第一个想法类似,但是当用户登录时,记下他们的用户名并在客户端检查该权限,然后在他们实际 make/delete 时也在服务器端检查权限a post 来验证他们是否真的被允许这样做。
这些选项中的任何一个看起来都是可行的前进方式吗?如果我仍然可以通过 Guard 做到这一点,那又如何呢?
我会选择你的解决方案 3.
事实上,您甚至不需要在用户登录时存储他们的用户名。当您在您的应用程序中采用 JWT 授权时,您应该存储 JWT 令牌(如果它在登录时设置在您的 cookie 中,您甚至不需要手动存储它)。
您的 JWT 令牌应包括关于您的用户的非常基本的信息(可能是用户名或 UUID,以及您认为合适的其他信息)以及令牌信息。当您的用户访问个人资料页面时,您应该使用此 JWT 令牌从后端检索用户信息。 (即在授权 header 中附加此 JWT 不记名令牌,或将其包含在 cookie 中。您的后端应读取此 JWT 令牌并检索唯一标识符(建议的用户名/uuid)以检索用户信息)
当用户要更新用户信息时,您应该再次附加 JWT 不记名令牌,后端应根据需要使请求无效。
我还建议只启用 /user
路由,或者为普通用户启用 /myprofile
路由之类的东西。 /user/:username
路由只对有权查看他人资料的人开放,管理员说。
我会将用户自己的个人资料页面放在自己的路线中,而不是与其他人的路线相同。通过这种方式,您可以在个人、私人资料页面上提供所有安全(服务器端),而其他人的资料页面将是一个 public 页面,没有任何编辑、删除、添加等方式
我目前正在使用 Angular 6 制作一个小项目来练习一些客户端-服务器交互,这是一个简单的博客样式网站,用户可以在其中查看其他人的 post 并制作自己的以及。到目前为止,我已经处理了 JWT 身份验证和路由保护,以防止未登录的人查看受保护的资源。
项目当前的结构方式是每个用户都有一个由 ProfilePage
组件显示的用户配置文件。在我的路由器中,我导航到具有结构 /user/:username
的正确用户页面,其中 :username
是服务器将为其发回适当数据的特定用户页面。我要解决的问题是我如何做到这一点,以便登录到他们帐户的用户只能在他们的个人资料页面上添加和删除 posts,而不是其他人的。
我已经阅读了有关用户权限和角色的信息,但是如果两个用户的角色都是 "USER",我如何区分用户是否正在查看他们的页面?
我的一些想法:
当用户导航到页面时动态检查页面上的权限,所以我会向服务器发送请求(使用 JWT 承载),它会发回 user/editor 角色状态对于该页面,然后当用户 post 进行某些操作时,服务器将再次验证是否允许用户 post 在后端实际进行更改之前。
我的另一个想法是制作一个单独的 MyProfile 组件,除了带有编辑器按钮外,它的行为、外观和感觉都像用户配置文件。我可以看到的问题是,当我实现一个可以删除任何用户的 post 的 ADMIN 角色时,我稍后 运行 会遇到麻烦(出于本项目的教育目的,道德除外)。
与第一个想法类似,但是当用户登录时,记下他们的用户名并在客户端检查该权限,然后在他们实际 make/delete 时也在服务器端检查权限a post 来验证他们是否真的被允许这样做。
这些选项中的任何一个看起来都是可行的前进方式吗?如果我仍然可以通过 Guard 做到这一点,那又如何呢?
我会选择你的解决方案 3.
事实上,您甚至不需要在用户登录时存储他们的用户名。当您在您的应用程序中采用 JWT 授权时,您应该存储 JWT 令牌(如果它在登录时设置在您的 cookie 中,您甚至不需要手动存储它)。
您的 JWT 令牌应包括关于您的用户的非常基本的信息(可能是用户名或 UUID,以及您认为合适的其他信息)以及令牌信息。当您的用户访问个人资料页面时,您应该使用此 JWT 令牌从后端检索用户信息。 (即在授权 header 中附加此 JWT 不记名令牌,或将其包含在 cookie 中。您的后端应读取此 JWT 令牌并检索唯一标识符(建议的用户名/uuid)以检索用户信息)
当用户要更新用户信息时,您应该再次附加 JWT 不记名令牌,后端应根据需要使请求无效。
我还建议只启用 /user
路由,或者为普通用户启用 /myprofile
路由之类的东西。 /user/:username
路由只对有权查看他人资料的人开放,管理员说。
我会将用户自己的个人资料页面放在自己的路线中,而不是与其他人的路线相同。通过这种方式,您可以在个人、私人资料页面上提供所有安全(服务器端),而其他人的资料页面将是一个 public 页面,没有任何编辑、删除、添加等方式