我正在为客户端应用程序开发Restful API,它将在资源所有者提供必要权限后访问服务器上的资源。为实现这一目标,我计划使用Spring Oauth2。目前,我要求认证。代码到auth。服务器并使用它来获取用于访问资源所有者资源的令牌。例如:
1-客户端应用程序要求范围' readPhotos'映射到:/ api / v1 / photos
2-资源所有者在授权服务器显示的页面上输入其凭据。
3-授权服务器询问资源所有者是否要为其照片授予访问权限。
4-资源所有者批准并将授权代码传递给客户端应用程序。
5-检索代码后,客户端应用程序将其传递给auth。服务器用于令牌。
6-收到令牌,客户可以到达照片。
但是,我想让客户端指定它想要获得权限的资源子集。例如,假设资源所有者拥有" photo1"," photo2"," photo3"," photo4"在资源服务器中。使客户端应用程序对资源子集进行授权的正确方法是什么,例如文件" photo1,photo3"但不是整个系列。如何制作范围定义?由于每个用户的资源会有所不同(每个用户的照片ID都不同),因此无法使用Spring Oauth2的ResourceServerConfigurerAdapter静态地使用单个范围定义每个资源。目前我正在使用以下配置进行照片权限。但是,正如我所提到的,这个范围定义过于通用,并且允许整个集合。
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
http.requestMatchers().antMatchers(HttpMethod.GET, "/api/v1/photos").access(" #oauth2.clientHasRole('ROLE_CLIENT') and #oauth2.hasScope('readPhotos')")
答案 0 :(得分:0)
访问令牌具有范围,并且具有受众(一般而言)。那些是你的变数。您可能不得不使用与资源相对应的范围(但我认为观众也是相关的)。困难的部分是验证Auth服务器中的范围(或受众)。实际上,我不希望auth服务器能够了解有关可用资源的任何信息,因此您几乎必须授予客户端请求的任何范围,这可能会使对象失败。所以我认为最重要的是你需要问自己,令牌是否真的是放置信息的正确位置,除非你的例子不真实,真正的用例更有趣。
或者您可以将验证范围的责任放在用户身上(他必须批准访问单张照片)。我认为,对于有批准的授权(例如授权代码),这是有效的。