0
spring security 4.1.3.RELEASE intercept-url request-matcher="mvc"

spring-security.xml を使用して Web セキュリティを構成しようとしましrequest-matche="mvc"たが、パターン「/users/{userId:id}」が機能しません。

私の設定は、次のコードのようになります。

<http entry-point-ref="myAuthenticationEntryPoint" auto-config="true" use-expressions="true" create-session="stateless" request-matcher="mvc" 
      access-decision-manager-ref="myAccessDecisionManager">
    <intercept-url pattern="/users/{userId:\\d+}" method="GET" access="@webSecurity.isMe(authentication, #userId) or hasAnyRole('ADMIN')"/>
    <intercept-url pattern="/users/management" method="GET" access="hasAnyRole('ADMIN')"/>
</http>

/users/12345 のリクエストはパターン /users/{userId:\d+} に一致し、12345 が userId に一致し、/users/management のリクエストはパターン /users/management に一致すると予想されます。ただし、実際には、パターン /users/{userId:\d+} は機能せず、リクエスト /users/12345 とは一致しません。そして、設定を次のコードに変更すると:

<http entry-point-ref="myAuthenticationEntryPoint" auto-config="true" use-expressions="true" create-session="stateless" request-matcher="mvc" 
      access-decision-manager-ref="myAccessDecisionManager">
    <intercept-url pattern="/users/{userId}" method="GET" access="@webSecurity.isMe(authentication, #userId) or hasAnyRole('ADMIN')"/>
    <intercept-url pattern="/users/management" method="GET" access="hasAnyRole('ADMIN')"/>
</http>

/users/{userId:\d+} から :\d+ を削除すると、/users/12345 の要求と一致します。ただし、/users/management の要求にも一致するため、userId の値が予期しない「management」に等しくなります。ant-matcher と regex-matcher を試しましたが、完璧なソリューションで userId を見つけることができません。

4

1 に答える 1

0

私は自分で問題を解決しました。愚かな間違いです。この問題を解決するには、 MvcPathMatcher を使用する代わりに、またはAntPathMatcher に置き換え/users/{userId:\\d+}て使用するだけです。spring-security.xml を使用したセキュリティの構成は、javaConfig を使用するか、アノテーションを使用するかによって異なります。javaConfig またはアノテーション @RequestMapping では、のコンテンツは文字列オブジェクトであるため、. しかし、xml では不要です。ここで使用すると、Spring Security はそれを に追加しますが、これは数値型の文字列とは決して一致しません。ブレークポイントを設定してリクエストを監視すると、この解決策が見つかります。/users/{userId:\d+}/users/{userId:[0-9]+}""\\d+\\d+\\\\d+org.springframework.util.AntPathMatcher.matchStrings(String str, Map<String, String> uriTemplateVariables)

于 2018-11-05T09:57:41.487 に答える