Переменные пути в выражениях веб-безопасности и set / users / {userId: \\ d +} - PullRequest
0 голосов
/ 05 ноября 2018
spring security 4.1.3.RELEASE intercept-url request-matcher="mvc"

Я пытаюсь использовать spring-security.xml для настройки моей веб-безопасности с 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>

Удалите: \ d + из / users / {userId: \ d +}, он будет соответствовать запросу для / users / 12345. Но он также будет соответствовать запросу для / users / management, что делает значение userId равным неожиданному «управлению». Я попробовал ant-matcher и regex-matcher, и я не могу найти userId в идеальном решении.

1 Ответ

0 голосов
/ 05 ноября 2018

Я решил проблему самостоятельно. Это глупая ошибка. Чтобы решить эту проблему, мне просто нужно заменить /users/{userId:\\d+} на /users/{userId:\d+} или /users/{userId:[0-9]+} и использовать AntPathMatcher вместо MvcPathMatcher. Настройка безопасности с помощью spring-security.xml не зависит от использования javaConfig или аннотации. В javaConfig или аннотации @RequestMapping содержимое в "" является объектом String, поэтому нам нужен еще один \ для экранирования \d+. Но в XML это не нужно. Если здесь используется \\d+, Spring Security добавит его к \\\\d+, что никогда не будет соответствовать строке числового типа. Я нахожу это решение, когда устанавливаю точку останова в org.springframework.util.AntPathMatcher.matchStrings(String str, Map<String, String> uriTemplateVariables) и наблюдаю за запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...