Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有spring安全性的OAuth2-通过HTTP方法限制REST访问_Java_Rest_Spring Security_Scope_Oauth 2.0 - Fatal编程技术网

Java 具有spring安全性的OAuth2-通过HTTP方法限制REST访问

Java 具有spring安全性的OAuth2-通过HTTP方法限制REST访问,java,rest,spring-security,scope,oauth-2.0,Java,Rest,Spring Security,Scope,Oauth 2.0,因此,我们使用spring-security在REST服务器和客户端应用服务器之间实现了OAuth2-客户端凭据授予。客户端可以使用使用客户端凭据身份验证获得的令牌访问其资源 我没有得到的是可以为客户端设置的范围和资源 我明确地说,客户端A有角色X和范围读取,我说资源U可以通过角色X和范围读取访问。现在我希望资源拒绝任何DELETE或POST请求,但显然我错了。如果我发送一个httpdelete到资源U,它就会通过 因此,在我的设置中,范围似乎毫无意义。我怎样才能利用它们 还是我仍然需要像下面建

因此,我们使用spring-securityREST服务器和客户端应用服务器之间实现了OAuth2-客户端凭据授予。客户端可以使用使用客户端凭据身份验证获得的令牌访问其资源

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

我明确地说,客户端A角色X范围读取,我说资源U可以通过角色X范围读取访问。现在我希望资源拒绝任何
DELETE
POST
请求,但显然我错了。如果我发送一个
httpdelete
资源U,它就会通过

因此,在我的设置中,范围似乎毫无意义。我怎样才能利用它们

还是我仍然需要像下面建议的那样限制对资源本身的访问


我们的设置中的代码片段:

<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>

是否有任何“简单”配置告诉服务器端的spring security,角色读取应该只允许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"/> 


或者类似的

谢谢你的建议。但是正如我所说的,我不想单独注释我所有的REST方法,而是在一个地方设置权限。此外,我不想将作用域转换为角色。首先我可以使用一个角色,而不使用任何作用域。你有没有尝试过
或类似的东西啊,我想这就是我想要的<代码>然后我为post和delete调用定义了另一个角色。。我试试看。谢谢
<security:intercept-url pattern="/rest/persons" access="hasAnyRole('ROLE_USER_READ')" method="GET"/>