因此,我们使用 spring- 在我们的 REST 服务器 和客户端应用程序服务器 之间实现了 OAuth2 - 客户端凭证授予安全 。客户端可以使用它使用客户端凭据身份验证获得的 token 访问其资源。
我没有得到的是我可以为客户端和资源设置的范围。
我明确地说,客户 A 具有角色 X 和范围 READ 我说资源 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) {
虽然如果我必须这样做那将是一个可怕的消息,因为那时我必须单独配置每个资源......
也许我可以使用一些过滤器?
感谢您对此的任何帮助!
最佳答案
为什么不能用
@RolesAllowed({"customRole"})
保护您的 HTTP 方法,并使用过滤器将 Oauth 范围转换为 {customRole}
或者你试过
<security:intercept-url pattern="/rest/persons" access="hasAnyRole('ROLE_USER_READ')" method="GET"/>
或类似的东西
关于java - 带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316506/