Может ли Spring вычислять все символы / выражения в выражениях SpEL по мере их вставки из файла свойств?
Интересно, почему 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'
с коренными причинами: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')
Msgstr ". После правильного введения этого значения, если одиночные кавычки добавляются при передаче@PreAuthorize(...)
будет как@PreAuthorize("'hasRole('ROLE_ADMIN')'")
, Так "'hasRole('ROLE_ADMIN')'
"это строка, а не логическое значение. Это просто мой подозреваемый.
Вопрос:
Вы считаете, что мой вывод верен? если нет, можете ли вы указать мне, если я что-то пропустил? Или предоставьте мне, если у вас есть альтернативные решения для достижения@PreAuthorize(...)
введя значения из файла свойств.
Заранее спасибо!
Note
Это не проблема ни конфигурации, ни внедрения. Я проверил, что значения правильно введены.