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.Boolean
java.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.