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

Posted

技术标签:

【中文标题】带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问【英文标题】:OAuth2 with spring-security - limit REST access by HTTP method 【发布时间】:2012-12-28 07:09:48 【问题描述】:

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

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

我明确说过,Client A 具有 Role XScope READ,我说 Resource 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) 

如果我不得不这样做,那将是一个可怕的消息,因为我必须单独配置每个资源......

也许我可以使用一些过滤器

感谢您对此的任何帮助!

【问题讨论】:

【参考方案1】:

为什么不能用

@RolesAllowed("customRole")

保护您的 HTTP 方法,并使用过滤器将 Oauth 范围转换为 customRole

你试过了吗

<security:intercept-url pattern="/rest/persons" access="hasAnyRole('ROLE_USER_READ')" method="GET"/> 

或类似的东西

【讨论】:

感谢您的建议。但就像我说的那样,我宁愿不必单独注释所有 REST 方法,而是将权限设置在一个地方。此外,我不想将范围转换为角色。我可以一开始就使用一个角色,而根本没有作用域。 你试过&lt;security:intercept-url pattern="/rest/persons" access="hasAnyRole('ROLE_USER_READ')" method="READ"/&gt;或类似的东西 啊,我想这就是我想要的! &lt;intercept-url pattern="/rest/persons" access="ROLE_PERSONS,SCOPE_READ" method="GET"/&gt; 然后我为 post 和 delete 调用定义了另一个角色.. 我会试一试。谢谢!

以上是关于带有 spring-security 的 OAuth2 - 通过 HTTP 方法限制 REST 访问的主要内容,如果未能解决你的问题,请参考以下文章

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

Spring-security /login 重定向

带有 spring-security AuditorAware 的 spring-data-jpa 应用程序中的 ***Exception

grails spring-security 插件保护所有控制器,而不仅仅是带有@Secured注解的控制器

Spring-Security:认证后调用方法

Spring-security、Tomcat 和 SPNEGO - 最佳方法