我正在使用OAuth2构建一个SpringBoot RESTful api作为安全组件。
我想知道如何保护我的资源,但更多地考虑业务逻辑。例如,如果我有一个课程列表/rest/v1/courses
,并且这些课程有一个Supervisor
并且假设我记录为ROLE_SUPERVISOR(没有管理员访问权限)并且我打电话给/rest/v1/courses
并且作为商业逻辑,我只能看到我担任主管的课程。
1)我应该制作/rest/v1/courses?supervisor_id=2
。经典过滤器,如果我在管理员的位置,但是登录的任何人,如果跟踪网址并更改了ID,则可以看到其他数据。
2)我应该制作/rest/v1/courses
并从成功登录中获取supervisor_id
吗?所以我必须针对登录数据检查每个请求。
我认为这是更安全的方法,但听起来有点乏味,我可能忘记在任何控制器方法中执行安全检查。
3)也许有一个更通用的解决方案,我无法找到或想到?
谢谢,对不起我的英语。
答案 0 :(得分:0)
RESTful API是无状态的。因此,对于每个请求,您必须立即使用令牌或通过检查OAuth服务来验证请求的凭据。如果supervisor_id
链接到凭据(例如,令牌值xyz
暗示supervisor_id = 2
),并且此ID确定访问权限,则无需将其添加为请求参数。无论如何,您总是会根据凭证验证此参数。
现在,如果"主管2"可以请求有关"主管1"的信息,然后是,您可能希望该ID作为另一个请求参数。您仍然需要检查凭据以了解"主管2"正在发出请求并验证他们可以查询的内容。
所以我必须针对登录数据检查每个请求。我认为这是更安全的方法,但听起来有点乏味,我可能忘记在任何控制器方法中执行安全检查。
基本上,标识请求者的任何内容都应该是您的身份验证机制的一部分,与您的特定API业务逻辑分开。您将在许多框架中找到在URL路由之前处理身份验证的工作流。这包括为您的控制器提供用户信息。