【发布时间】:2017-05-10 11:10:56
【问题描述】:
我有一个 Spring Web 服务,用户只能访问特定资源。任何用户都可以请求获取资源信息,但如果他们无权访问该资源,我需要抛出授权异常。 API如下:
GET /resources/{resourceId}
上述 API 为用户提供了有关给定资源的所有信息。
目前我使用WebSecurityConfigurerAdapter 进行身份验证。要添加授权,我观察到我可以将授予的权限设置为 Authentication 对象的一部分。这样做时,我可以使用@PreAuthorize("hasRole('ROLE_USER')") 之类的东西来进行授权。
但是,对于上述 API,我不确定上述授权方法是否适用,原因如下。
- 我根据用户是否有权访问特定的
resourceId进行授权。这不完全是一个角色。更像是一种特权。在这个用例中使用hasRole()是否仍然可以接受? - 如果我确实使用了
hasRole()注释,我将需要执行@PreAuthorize("hasRole('ACCESS_RESOURCEID12346')")之类的操作,其中RESOURCEID12346是resourceId。但是,我们只有在 API 控制器中才能访问resourceId。那么,如何将该值用于授权注释?
如果指定的方法不是解决问题的最佳方法,我将不胜感激任何关于最佳方法的输入/反馈。我想避免在控制器中进行此检查。我正在尝试通过类似于 @PreAuthorize 工作方式的 Spring Security 来完成它。我认为访问 resourceId 是一项授权要求,如果用户无权访问该资源,我们甚至不应该进入 API 控制器。
【问题讨论】:
-
你有用户信息,所以我会在数据库中提供一个 UserResouce 表并检查 get 上的关系。
-
1.这不是将身份验证和授权结合起来吗?根据我的设计理解,最好将身份验证和授权分开。 2. 如何访问我需要检查的 resourceId?它只是 API 路径的一部分。
-
我不知道它会如何结合它。您在 ROLE_USER 上通过 preauth 进行了身份验证,对吗?因此,您已经通过身份验证,并且拥有路径和 ID。因此,做出假设,您可以在查询使用上述表的情况下执行
getResourceByUserAndResourceId(...)。 -
你是在建议这样的事情:@PreAuthorize("hasRole('ACCESS_" + @PathVariable("resourceId") + "')")?那不编译。
-
@AndroidDev93
RESOURCEID12346看起来很像 ACL,应该是动态的,而不是直接在 Java 代码中。
标签: java spring spring-security