java - 带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问

标签 java rest spring-security scope oauth-2.0

因此,我们使用 spring- 在我们的 REST 服务器客户端应用程序服务器 之间实现了 OAuth2 - 客户端凭证授予安全 。客户端可以使用它使用客户端凭据身份验证获得的 token 访问其资源。

我没有得到的是我可以为客户端和资源设置的范围

我明确地说,客户 A 具有角色 X范围 READ 我说资源 U 可以是通过Role XScope READ 访问。现在我希望资源拒绝任何 DELETEPOST 请求,但显然我错了。如果我向 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/

相关文章:

javascript - spring boot/spring security 忽略来自 javascript 的登录调用

java - MainActivity 上的 onActivityResult Intent 为 null

java - 使用相同的字符串部分进行正则表达式检查

java - 使用 Hibernate/Spring/Maven/MySQL 测试运行后防止数据被删除

python - 使用 HTTP Digest 身份验证保护 REST 端点

java - patch 与 merge-patch 哪个更合适?

django - 抓取request.GET中的URL参数

java - Spring中@EnableWebSecurity有什么用?

spring 安全、方法安全和 url 安全

java - 报警管理器: repeating alarm not always fires