Может ли 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.Booleanjava.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Это не проблема ни конфигурации, ни внедрения. Я проверил, что значения правильно введены.

Ответы на вопрос(1)

Ваш ответ на вопрос