【发布时间】:2012-12-28 07:09:48
【问题描述】:
因此,我们使用 spring- 在 REST 服务器 和 客户端应用程序服务器 之间实现了 OAuth2 - 客户端凭据授予-安全 。客户端可以使用客户端凭据身份验证获得的令牌访问其资源。
我没有得到的是我可以为客户和资源设置的范围。
我明确说过,Client A 具有 Role X 和 Scope READ,我说 Resource U 可以使用 Role X 和 Scope READ 访问。现在我希望资源拒绝任何DELETE 或POST 请求,但显然我错了。如果我向 Resource U 发送 HTTP DELETE 它将通过。
所以看起来范围在我的设置中毫无意义。我该如何使用它们?
或者我是否仍需要按照下面的建议限制对资源本身的访问?
我们设置的片段:
<oauth:client-details-service id="clientDetails">
<oauth:client client-id="the_client"
authorized-grant-types="client_credentials" authorities="ROLE_CLIENT"
scope="read" secret="secret" />
</oauth:client-details-service>
<http pattern="/rest/**" create-session="never"
entry-point-ref="oauthAuthenticationEntryPoint"
access-decision-manager-ref="accessDecisionManager"
xmlns="http://www.springframework.org/schema/security">
<anonymous enabled="false" />
<intercept-url pattern="/rest/persons" access="ROLE_CLIENT,SCOPE_READ" />
<custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
<access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
REST 资源:
@Path("/persons")
@Named
public class PersonRest {
@GET
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces({ MediaType.APPLICATION_JSON })
public Response getAll(@Context UriInfo uriInfo) {
// ...
}
@DELETE
@Path("/{id}")
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response delete(@PathParam("id") String id) {
// ...
}
是否有任何“简单”的配置来告诉服务器端的 Spring Security,ROLE_READ 应该只允许 GET 请求?
或者我是否需要为特定资源设置一些 @PreAuthorize 注释或上下文设置?
那么,这样的事情会起作用吗:?
@PreAuthorize("hasScope(read)")
@DELETE
@Path("/{id}")
// ...
public Response delete(@PathParam("id") String id) {
如果我不得不这样做,那将是一个可怕的消息,因为我必须单独配置每个资源......
也许我可以使用一些过滤器?
感谢您对此的任何帮助!
【问题讨论】:
标签: java rest spring-security scope oauth-2.0