7

<http>ノードの applicationContext-security.xml で spring-roo によって生成された構成ファイルで学習しているときに、spring-security を使用して Web を保護します。

 <intercept-url pattern="/userses?form" access="hasRole('ROLE_ADMIN')" />

これは、Users オブジェクトを作成する場合、最初にログインして ADMIN 権限を取得する必要があることを意味します。しかし、実際にはうまくいきませんでした。ログを確認します。

2012-05-06 11:39:11,250 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/userses'; against '/userses?form'

フレームワークは、/userses?フォームの代わりに /userses を使用して比較します。文字列が一致しなかったため、認証プロセスがスキップされました。これを確認するために、別の URL も試します。

<intercept-url pattern="/userses/abc" access="hasRole('ROLE_ADMIN')" />

/userses/abc をリクエストしたところ、ユーザーが承認されていないことが検出され、/login ページに移動してログを確認しました。

2012-05-06 11:46:44,343 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/uesrses/abc'; against '/userses/abc'

だから私の質問は次のとおりです: spring-secure 3 は "?parameter" パターンをサポートしていませんか、これをサポートするために構成するものを逃しましたか? PS: すべてのコードは変更なしで roo によって生成されます。また、なぜ機能しないのか不思議です。

4

2 に答える 2

8

デフォルトでは、Spring Securityは ant スタイル マッチングを使用しますが、これはパラメーターで一致させることはできません。ただし、正規表現一致はパラメーターで一致する可能性があります

次のように定義してみてください。

<http request-matcher="regex">
  <security:intercept-url pattern="\A/userses\?form.*\Z" access="hasRole('ROLE_ADMIN')" />
</http>

Roo がこれを自動的に行わない理由がわかりません。そうあるべきだと思われます。

于 2012-05-06T04:36:06.850 に答える
6

その動作は、使用中の「request-matcher」によって定義されます。ドキュメントに示されているように、デフォルトは「ant」で、これはAntPathRequestMatcherを使用することを示し、代替は「regex」、RegexRequestMatcherです。javadocs(リンク)は、前者がリクエストの「servletPath + pathInfo」と一致し、後者がその「servletPath + pathInfo + queryString」と一致するという事実を含む、マッチャーに関する詳細を提供します。

于 2012-05-06T04:41:39.357 に答える