阻止用户调用受保护的端点+ OAuth2

时间:2018-04-18 03:12:09

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

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

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

POST /用户/ {USER_ID}

登录用户将能够通过转到更新配置文件屏幕更新自己的配置文件,后者将在后台调用/ users / {user_id}发送带有新信息和访问令牌的有效负载。

我们如何防止恶意用户调用同一端点来更新其他用户的个人资料?

身份1的用户应该能够呼叫/ users / 1而不能呼叫/ users / 2吗?

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

感谢。

3 个答案:

答案 0 :(得分:2)

如果您想坚持使用典型的REST风格的API(即要更新的用户配置文件的ID随请求一起发送),您必须向服务器端添加一些额外的检查。用于对用户进行身份验证的访问令牌包含她/他的身份,该身份应该在请求范围中产生相应的Principal对象。您必须检查此委托人所代表的用户是否真的有权更新请求中包含ID的用户配置文件。

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

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

答案 1 :(得分:-1)

有一种很酷的东西叫做角卫士。 Heres链接文档:https://angular.io/guide/router

答案 2 :(得分:-1)

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

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