O Spring pode avaliar todos os caracteres / expressões em expressões SpEL à medida que são injetados a partir de um arquivo de propriedades?

Eu me pergunto por que a primavera não avalia diretamente todas as expressões à medida que são injetadas de um arquivo de propriedades em@PreAuthorize(...) anotação. Eu acho que a primavera não avalia alguns caracteres como '(', ')', '' ', etc ou adiciona caracteres especiais sobre os valores injetados do arquivo de propriedades. Para esclarecer, vamos considerar o seguinte exemplo.

@PreAuthorize("hasRole('ROLE_ADMIN')")

A expressão acima é normal e funciona bem. Suponha que os valores do arquivo de propriedades sejam os seguintes.

role1=ROLE_ADMIN
role2='ROLE_ADMIN'
role3=hasRole('ROLE_ADMIN')

Nos deixe injetarrole1 do arquivo de propriedades e passá-lo para@PreAuthorize("hasRole(${role1})"), Funciona bem. No modo normal de avaliarhasRole(...) expressão, o nome da função deve estar entre aspas simples, ou seja,'ROLE_ADMIN'. Mas aqui funciona com ROLE_ADMIN. Surpreendente!.

Se injetarmosrole2 do arquivo de propriedade em@PreAuthorize("hasRole(${role2})"), ele retorna o acesso negado. Isso significa que é avaliado, mas podemos perceber que o valor passado para a expressão é algo diferente de "'ROLE_ADMIN'Então, se o nome da função estiver entre aspas simples, o acesso será negado. Outra surpresa.

Se tentarmos injetarrole3 de um arquivo de propriedade em@PreAuthorize("${role3}"), não está sendo avaliado também. exceções:

java.lang.IllegalArgumentException: Failed to evaluate expression 'role3' com causas principais: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')'

Minha conclusão:

De (1) e (2) acima, podemos perceber uma coisa. Ou seja, parece que os valores injetados são colocados entre aspas simples ('') ao serem passados ​​para o@PreAuthorize(...) anotação. Se esta afirmação não for verdadeira, (1) e (2) não estaria funcionando. É apenas a minha conclusão !.

Quando chegamos a (3), o caso parece semelhante a (1) e (2). O valor no arquivo é "hasRole('ROLE_ADMIN')". Após injetar este valor corretamente, se aspas simples forem adicionadas ao passar para o@PreAuthorize(...)será como@PreAuthorize("'hasRole('ROLE_ADMIN')'"). Assim "'hasRole('ROLE_ADMIN')'"é uma string não um valor booleano. É apenas meu suspeito.

Questão:

Você acha que minha conclusão está correta? se não, você pode me apontar se há algo que eu perdi? Ou me fornecer se você tiver soluções alternativas para alcançar@PreAuthorize(...) injetando valores do arquivo de propriedades.

Agradeço antecipadamente!

Note: não é um problema de configuração nem injeção. Eu verifiquei se os valores foram corretamente injetados.

questionAnswers(1)

yourAnswerToTheQuestion