0

「パーティ」にアクセスするためのRESTAPIがあり、URLは次のようになります。

/parties
/parties/{partyId}

Springコントローラーと@PathVariableを使用して、このインターフェイスを実装できます。しかし、ユーザーがアクセスできないパーティにアクセスできないようにするには、すべてのメソッド呼び出しにチェックを追加する必要があります。これは、自分自身を繰り返すようなものであり、どこにでも追加するのを忘れる可能性があります。

@RequestMapping(value="/parties/{partyId}", method=RequestMethod.GET)
public @ResponseBody Party getParty(@PathVariable Integer partyId){
    authorizeForParty(partyId);
    ...

ここで私がしたいのは、ユーザーが次のようにURLを入力するたびに呼び出されるチェックを作成することです。

/parties/{partyId}/**

どうすればこのようなことができますか?サーブレットフィルターを作成してURLを自分で解析する必要がありますか?URLを解析する必要がある場合、それを簡単にするツールは少なくともありますか?メソッドの前に呼び出されるが、@PathVariablesなどを使用できるメソッドをコントローラーに追加する方法があればいいのにと思います...

4

2 に答える 2

2

私が最終的に得たのは、Spring MVC インターセプターを使用し、Spring と同じ方法でパス変数を解析することです。そこで、REST URL のインターセプターを定義します。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/parties/*/**" />
        <bean class="PartyAuthorizationInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

PartyAuthorizationInterceptor は、preHandle を実装する必要がある HandlerInterceptor を実装する必要があります。パラメータとして HttpServletRequest があるため、リクエスト URL を取得できますが、URL から partyId を解析する必要があります。Spring MVC の仕組みを読んだ後、org.springframework.util.AntPathMatcher という名前のクラスがあることがわかりました。URL からパス変数を読み取り、その値をマップに配置できます。このメソッドは、extractUriTemplateVariables と呼ばれます。

したがって、結果は次のようになります。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String partyIdStr = new AntPathMatcher().extractUriTemplateVariables("/parties/{partyId}/**", request.getPathInfo()).get("partyId");
    ...

これにより、MVC コントローラー メソッドで @PathVariable を使用するのと同じくらい簡単に解析できます。自分で変換を行う必要があります (例: String -> Integer)。

これで、このインターセプターのパーティにアクセスするすべての URL に承認ロジックを実装し、そのロジックを個々のコントローラー メソッドから除外できます。私が望んでいたほど簡単ではありませんが、仕事は完了します。

于 2012-12-30T13:07:43.457 に答える
1

Spring Security など、アプリケーションで何らかのセキュリティ ライブラリを既に使用していますか?

実装したいロジックの種類はAccessDecisionVoter、認証チェーンの典型的なケースであるためです。API を Spring Security の保護の背後に置き、セキュリティ チェーンの一部としてカスタム チェックを実装するだけです。

ただし、セキュリティ フレームワークをまったく使用していない場合は、実装するという考えがHandlerInterceptor最良の選択肢かもしれません。../../ただし、(前述のように) ユーザーが他の URL にアクセスするために使用する可能性のあるあらゆる種類の難読化 (文字、パターンなどの % エンコードなど) を考慮する必要があります。

于 2012-12-30T16:13:52.083 に答える