我正在使用Apache cxf OAuth2来保护我的jax-rs API。我使用的是cxf 3.1.5版本。正如文档here
中所述从Apache cxf 3.1.5开始@Scopes可用于更精细的范围处理。 我已成功为特定的已批准范围生成访问令牌。当我尝试使用此令牌访问我的API时,理想情况下它不应该允许我访问API,因为它具有@Scopes注释中提到的不同访问范围。但是它允许我访问这个API。
这是我的API:
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/exportSheets")
@Scopes("testScope1")
@ConfidentialClient
String exportSheets(@QueryParam("userId") Integer userId);
这是我用来访问此API的访问令牌
{
"tokenKey": "f2154782f82947318d1fc363e4309fa6",
"tokenType": "Bearer",
"expiresIn": 3600,
"issuedAt": -1,
"parameters": {},
"approvedScope": "read"
}
如您所见,令牌包含approvedScope为read
,其中API为testScope1
。即使这个范围不匹配,它也允许我访问我的API。
这是我为创建服务器端点所做的测试配置。
@Bean
@DependsOn("cxf")
public Server ornateTestAPIs(){
JAXRSServerFactoryBean factory=jaxRSServerFactory();
factory.setAddress("/test");
factory.setServiceBeans(Arrays.asList(testApis));
factory.setProviders(Arrays.asList(jsonProvider(), new VcAPIExceptionMapper(), oauthRequestFilter(), oauthScopesFilter());
factory.setFeatures(Arrays.asList(swaggerFeature(), timingFeature));
factory.setInInterceptors(
Arrays.<Interceptor<? extends Message>>asList(new JAXRSBeanValidationInInterceptor()));
factory.setOutInterceptors(
Arrays.<Interceptor<? extends Message>>asList(new JAXRSBeanValidationOutInterceptor()));
return factory.create();
}
public OAuthRequestFilter oauthRequestFilter(){
OAuthRequestFilter requestFilter=new OAuthRequestFilter();
requestFilter.setDataProvider(oAuthDataProviderImpl());
return requestFilter;
}
public OAuthScopesFilter oauthScopesFilter(){
return new OAuthScopesFilter();
}
如您所见,我在提供程序中添加了OAuthScopeFilter和OAuthRequestFilter。 这是我的pom
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-security-oauth2</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-security-cors</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-service-description</artifactId>
<version>3.1.5</version>
</dependency>