是否可以使用 OAuth2 创建基于角色的应用程序?
Posted
技术标签:
【中文标题】是否可以使用 OAuth2 创建基于角色的应用程序?【英文标题】:Is possible to create a role based application with OAuth2? 【发布时间】:2019-12-11 06:45:40 【问题描述】:我要做的是创建一个带有 Angular 前端和带有 OAuth2 身份验证的 Spring Boot 后端的应用程序。
问题是我不知道如何访问 ROLES 用户拥有的前端,这样我就可以在页面上显示一些基于角色的内容。 是的,有OAuth 在响应中提供的范围,但问题是这些范围适用于 CLIENT,而不适用于特定的 USER 本身。而那个 CLIENT 是我的前端(如果我错了,请纠正我),这基本上意味着每个操作我的应用程序(客户端)的用户都将具有相同的范围(角色)。此外,我可以在后端指定角色在Spring
和UserDetailsService
的帮助下,然后将这些角色与@PreAuthorize
等一起使用。但不是在前端。
举个例子,如果我只使用单个 JWT,然后使用令牌本身,我会将用户名和角色都返回到前端。然后我可以存储这些数据并根据我的需要在前端使用它。
所以我要问的是这是否真的可行,这样做是否正确? 我怎么可能实现这样的行为?
【问题讨论】:
@ThomasAndolf 我没有找到任何描述如何通过 OAuth 在前端使用角色的信息。如果你有链接,请与我分享。 如果您有 oauth 令牌,则存储该令牌。然后您可以使用该令牌获取用户对象。您将令牌传递给后端并获取您以某种状态存储在前端的用户对象(包含用户角色)。 通过检查状态中的用户对象及其角色,您可以根据角色显示用户可以看到的内容。如果使用 jwt,根据您使用的 oauth2 流类型,您可以将令牌交换为 jwt,并且 jwt 本身包含用户角色。您将这些以某种状态存储在前端。什么状态管理系统取决于你。有些使用 Redux,有些使用 Mobx。 medium.com/engineerbabu/…medium.com/@amcdnl/authentication-in-angular-jwt-c1067495c5e0blog.angular-university.io/angular-jwt-authenticationjasonwatmore.com/post/2018/11/22/…stackblitz.com/edit/angular-7-role-based-authorization-example @ThomasAndolf 谢谢,这实际上是我的想法。 【参考方案1】:OAuth 不能解决这个问题,最好通过 API 中的声明来解决。 OAuth 应该只处理身份验证。我下面的帖子可能会帮助您考虑最佳分离:https://authguidance.com/2017/10/03/api-tokens-claims/
简而言之,您必须在 OAuth 处理完成后查找用户权限,例如角色。
【讨论】:
非常感谢。会通读你的文章。是的,我有一个问题。经过一点额外的研究,我发现OAuth2中除了范围之外还有权限。我想知道区别,唯一描述区别的页面是this one。但我并没有完全得到解释。如果您可以在此处重申已接受的答案或对差异给出您自己的解释 - 请,这绝对是很棒的。 ***.com/questions/32092749/… @ThomasAndolf 我刚刚在我的消息中提供了相同的链接。想听其他解释或重述已接受的答案。 客户端本身有一定的规则。假设网络浏览器可以调用某些服务并更新某些内容,而移动应用程序有权调用其他服务。这通常通过使用范围来调节。您可以根据客户端读取某些地方并写入其他地方。另一方面,用户有权做某些事情,而其他用户是不允许做的。如示例所述,用户可能能够更新某些内容,但 twitter 不能。【参考方案2】:YouTube 上有来自 Spring 开发者的 a great video 关于 OAuth2/OpenID Connect。它展示了如何使用最新的 Spring Security 5 解决方案来实现资源服务器。
实现这一点的最简单和最好的方法可能是使用 OpenID Connect 服务器,该服务器将提供所有用户管理内容。市场上有很多解决方案。 Auth0 和 Okta 是身份云,只需少量资金即可提供服务。另一方面,您有 Keycloak,这是一个可以安装在 Docker 甚至裸机上的服务器 - 它是免费和开源的。
【讨论】:
以上是关于是否可以使用 OAuth2 创建基于角色的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
向通过 Google OAuth2 创建的用户添加角色或声明