【问题标题】:Prevent users from calling protected endpoints + OAuth2阻止用户调用受保护的端点 + OAuth2
【发布时间】:2018-09-28 03:44:09
【问题描述】:

出于学习目的,我正在使用 OAuth2 开发一个 REST API + Angular 4 应用程序。

有些受保护的端点只能由经过身份验证的用户调用。我们以一个端点来更新用户的个人资料为例:

发布 /users/{user_id}

登录的用户将能够通过转到更新个人资料屏幕来更新他们自己的个人资料,该屏幕将在后台调用 /users/{user_id} 发送带有新信息和访问令牌的有效负载。

我们如何防止恶意用户调用同一端点来更新其他用户的配置文件?

id 为 1 的用户应该能够调用 /users/1 但不能调用 /users/2?

这可以通过 OAuth 完成吗?或者我在这里误解了什么?

谢谢。

【问题讨论】:

    标签: angular spring-boot spring-security oauth-2.0


    【解决方案1】:

    如果您想坚持使用典型的 REST 样式 API(即,要更新的用户配置文件的 ID 随请求发送),您必须在服务器端添加一些额外的检查。用于对用户进行身份验证的访问令牌包含她/他的身份,这将导致请求范围内的相应 Principal 对象。您必须检查此主体所代表的用户是否真的有权更新请求中使用 ID 提供的用户配置文件。

    例如,您可以首先从数据库中加载具有给定 ID 的配置文件,然后检查用户名是否等于主体之一。这也可以通过 Spring Security PreAuthorize 注释和其参数中的一点 SpEL 魔术来完成。

    替代方法:摆脱 REST 样式的 API,只需提供一个端点 /update-profile(或类似命名),它不需要用户 ID 作为 URL 的一部分。然后,您只需获取使用访问令牌提供的用户身份并更新数据库中的相应配置文件。因此,用户只能更新她/他可以获得访问令牌的配置文件。 - 缺点是您将无法允许某些超级用户或管理员在此设置中更新任意配置文件。

    【讨论】:

    • 正是我所需要的。谢谢!
    【解决方案2】:

    有一个很酷的东西叫做 angular 中的守卫。文档链接:https://angular.io/guide/router

    【讨论】:

      【解决方案3】:

      请阅读 Spring Security with Oauth2。由于您同时实现后端和前端,因此密码授予类型将是合适的。 Oauth 2.0 规范在这里讨论它:password grant type (aka, Resource Owner Password Credentials) check this link as well

      为了回答您的问题,在密码授权类型中 - 用户名和密码用于获取访问令牌。每个来自前端的请求都需要传递该访问令牌。安全端点将检查访问令牌是否有效以及是否针对同一用户颁发。

      【讨论】:

        猜你喜欢
        • 2020-10-31
        • 2018-07-12
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 2021-11-10
        • 1970-01-01
        相关资源
        最近更新 更多