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 を見つけることができません。