そのため、 spring-securityを使用して、 REST サーバーとクライアント アプリケーション サーバーの間にOAuth2 - クライアント資格情報の付与を実装しました。クライアントは、クライアント資格情報認証を使用して取得したトークンを使用してリソースにアクセスできます。
私が取得できないのは、クライアントとリソース用に設定できるスコープです。
私は明示的に、クライアント Aにはスコープ READを持つロール Xがあり、リソース Uにはロール Xとスコープ READでアクセスできると言いました。今、私はリソースがいずれかまたは要求を拒否することを期待していますが、どうやら私は間違っています。リソース Uに送信すると、通過します。DELETE
POST
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) {
// ...
}
ROLE_READ が GET リクエストのみを許可する必要があることを、サーバー側で春のセキュリティに伝える「単純な」構成はありますか?
または@PreAuthorize
、特定のリソースに対して注釈またはコンテキストの設定が必要ですか?
それで、そのようなものはうまくいきますか?
@PreAuthorize("hasScope(read)")
@DELETE
@Path("/{id}")
// ...
public Response delete(@PathParam("id") String id) {
私がこのようにそれをしなければならなかった場合、それは恐ろしいニュースですが、各リソースを個別に構成する必要があります...
多分私はいくつかのフィルターを利用できますか?
これについて助けてくれてありがとう!