Интересно, почему Spring не оценивает все выражения напрямую, поскольку они вводятся из файла свойств в аннотацию @PreAuthorize(...)
. Я думаю, что Spring не оценивает некоторые символы, такие как '(', ')', ''' и т. д., или добавляет специальные символы поверх этих введенных значений из файла свойств. Для пояснения рассмотрим следующий пример.
@PreAuthorize("hasRole('ROLE_ADMIN')")
Приведенное выше выражение является нормальным и работает нормально. Предположим, что значения файла свойств следующие.
role1=ROLE_ADMIN
role2='ROLE_ADMIN'
role3=hasRole('ROLE_ADMIN')
Давайте введем
role1
из файла свойств и передадим его в@PreAuthorize("hasRole(${role1})")
, все работает нормально. При обычном способе вычисления выраженияhasRole(...)
имя роли должно быть заключено в одинарные кавычки, т. е.'ROLE_ADMIN'
. Но здесь это работает с ROLE_ADMIN. Удивительно!.Если мы вставим
role2
из файла свойств в@PreAuthorize("hasRole(${role2})")
, он вернет отказ в доступе. Это означает, что оно оценивается, но мы можем понять, что значение, переданное выражению, отличается от «'ROLE_ADMIN'
». Таким образом, если имя роли заключено в одинарные кавычки, доступ будет запрещен. Еще один сюрприз!.Если мы попытаемся внедрить
role3
из файла свойств в@PreAuthorize("${role3}")
, он также не будет оцениваться. исключения:java.lang.IllegalArgumentException: Failed to evaluate expression 'role3'
with root causes:org.springframework.expression.spel.SpelEvaluationException: EL1001E:(pos 0): Type conversion problem, cannot convert from java.lang.String to java.lang.Boolean
java.lang.IllegalArgumentException: Invalid boolean value 'hasRole('ROLE_ADMIN')'
Мой вывод:
Из (1) и (2) выше мы можем понять одну вещь. То есть кажется, что введенные значения помещаются в одинарные кавычки (' ') при передаче в аннотацию @PreAuthorize(...)
. Если это утверждение неверно, (1) и (2) не будут работать. Это только мой вывод!.
Когда мы приходим к (3), случай кажется похожим на (1) и (2). Значение в файле "hasRole('ROLE_ADMIN')
". После правильного ввода этого значения, если при переходе к @PreAuthorize(...)
будут добавлены одинарные кавычки, оно будет похоже на @PreAuthorize("'hasRole('ROLE_ADMIN')'")
. Итак, «'hasRole('ROLE_ADMIN')'
» — это строка, а не логическое значение. Это просто мой подозреваемый.
Вопрос:
Вы считаете мой вывод правильным? если нет, можете ли вы указать мне, есть ли что-то, что я пропустил? Или предоставьте мне, если у вас есть альтернативные решения для достижения @PreAuthorize(...)
путем ввода значений из файла свойств.
Заранее спасибо!
Note
: это не проблема конфигурации или инъекции. Я проверил, что значения введены правильно.