【问题标题】:RESTful secure resources by user用户的 RESTful 安全资源
【发布时间】:2016-07-19 13:23:18
【问题描述】:

我正在构建一个使用 OAuth2 作为安全组件的 SpringBoot RESTful api。

我想知道如何保护我的资源,但更多地考虑业务逻辑。例如,如果我有一个课程列表/rest/v1/courses,而这门课程有一个Supervisor,并假设我登录为 ROLE_SUPERVISOR(没有管理员访问权限)并且我拨打了/rest/v1/courses 的电话,作为业务逻辑我只能查看我担任主管的课程。

1) 我应该发/rest/v1/courses?supervisor_id=2。经典过滤器,如果我在哪里有管理员就可以了,但是任何登录的人都可以在跟踪 url 并更改 id 时看到其他数据。

2) 我应该创建一个/rest/v1/courses 并从成功登录中获取supervisor_id 吗?所以我必须根据登录数据检查每个请求。 我认为这是更安全的方法,但听起来有点乏味,而且我可能会忘记在任何控制器方法中执行安全检查。

3)也许有更通用的解决方案,我找不到或想不到?

谢谢你,对不起我的英语。

【问题讨论】:

    标签: api rest security spring-boot


    【解决方案1】:

    RESTful API 是无状态的。因此,对于每个请求,您必须立即使用令牌或通过检查您的 OAuth 服务来验证请求的凭据。如果supervisor_id 链接到凭据(例如,令牌值xyz 暗示supervisor_id = 2),并且此ID 确定访问权限,则无需将其添加为请求参数。无论如何,您总是会根据凭据验证此参数。

    现在,如果“supervisor 2”可以请求有关“supervisor 1”的信息,那么是的,您希望 ID 作为另一个请求参数。您仍然需要检查凭据以了解“主管 2”正在发出请求并验证允许他们查询的内容。

    所以我必须根据登录数据检查每个请求。我认为这是更安全的方法,但听起来有点乏味,而且我可能会忘记在任何控制器方法中执行安全检查。

    基本上,识别请求者的任何内容都应该是您的身份验证机制的一部分,与您的特定 API 业务逻辑分开。您会在许多框架中找到在 URL 路由之前处理身份验证的工作流。这包括向您的控制器提供用户信息。

    【讨论】:

    • 是的,我必须检查所有请求(如非 restful 应用程序),但我想知道 spring boot 或 restful 架构是否有任何通用的“最佳实践”方法。那么如何在 oauth2 令牌上添加用户信息呢? (听起来像是典型网络应用程序中的 userSession)你的最后一段非常有趣。你有任何相关的链接吗?
    • 我不熟悉spring-boot,但以Symfony PHP框架为例,安全层是在路由组件之前处理的“防火墙”:symfony.com/doc/current/components/security/firewall.html。 OAuth2 提供者提供 API 调用来传递令牌并取回用户信息。这是标准流程的一部分。
    猜你喜欢
    • 2014-12-11
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多