4

そのため、 spring-securityを使用して、 REST サーバークライアント アプリケーション サーバーの間にOAuth2 - クライアント資格情報の付与を実装しました。クライアントは、クライアント資格情報認証を使用して取得したトークンを使用してリソースにアクセスできます。

私が取得できないのは、クライアントとリソース用に設定できるスコープです。

私は明示的に、クライアント Aにはスコープ READを持つロール Xがあり、リソース Uにはロール Xスコープ READでアクセスできると言いました。今、私はリソースがいずれかまたは要求を拒否することを期待していますが、どうやら私は間違っています。リソース Uに送信すると、通過します。DELETEPOSTHTTP 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) {
        // ...
    }

ROLE_READ が GET リクエストのみを許可する必要があることを、サーバー側で春のセキュリティに伝える「単純な」構成はありますか?

または@PreAuthorize、特定のリソースに対して注釈またはコンテキストの設定が必要ですか?

それで、そのようなものはうまくいきますか?

    @PreAuthorize("hasScope(read)")
    @DELETE
    @Path("/{id}")
    // ...
    public Response delete(@PathParam("id") String id) {

私がこのようにそれをしなければならなかった場合、それは恐ろしいニュースですが、各リソースを個別に構成する必要があります...

多分私はいくつかのフィルターを利用できますか?

これについて助けてくれてありがとう!

4

1 に答える 1

3

なんで使えないの

@RolesAllowed({"customRole"})

HTTP メソッドを保護し、フィルターを使用して Oauth スコープを {customRole} に変換します

またはあなたは試しましたか

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

または似たようなもの

于 2013-01-17T06:57:17.503 に答える