Czy Spring może oceniać wszystkie znaki / wyrażenia w wyrażeniach SpEL, ponieważ są one wstawiane z pliku właściwości?

Zastanawiam się, dlaczego wiosna nie ocenia bezpośrednio wszystkich wyrażeń, ponieważ są one wstawiane z pliku właściwości do@PreAuthorize(...) adnotacja. Myślę, że wiosna nie ocenia niektórych znaków, takich jak „(„, ”)”, „” ”itp., Albo dodaje znaki specjalne na wierzchu tych wstrzykniętych wartości z pliku właściwości. Aby wyjaśnić, rozważmy następujący przykład.

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

Powyższe wyrażenie jest normalne i działa dobrze. Załóżmy, że wartości pliku właściwości są następujące.

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

Wstrzyknijmyrole1 z pliku właściwości i przekaż go do@PreAuthorize("hasRole(${role1})"), to działa dobrze. W normalny sposób ocenianiahasRole(...) wyrażenie, nazwa roli musi znajdować się w pojedynczym cudzysłowie, tj.'ROLE_ADMIN'. Ale tutaj działa z ROLE_ADMIN. Zaskakujący!.

Jeśli wstrzykniemyrole2 z pliku właściwości do@PreAuthorize("hasRole(${role2})"), zwraca odmowę dostępu. Oznacza to, że jest oceniany, ale możemy zdać sobie sprawę, że wartość przekazana do wyrażenia jest czymś innym niż „'ROLE_ADMIN'„. Jeśli nazwa roli znajduje się pod pojedynczymi cudzysłowami, odmowa dostępu. Kolejna niespodzianka !.

Jeśli spróbujemy wstrzyknąćrole3 z pliku właściwości do@PreAuthorize("${role3}"), nie jest również oceniany. wyjątki:

java.lang.IllegalArgumentException: Failed to evaluate expression 'role3' z przyczynami źródłowymi: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')'

Mój wniosek:

Od (1) i (2) powyżej możemy zdać sobie sprawę z jednej rzeczy. To znaczy, wydaje się, że wprowadzone wartości są umieszczane w pojedynczych cudzysłowach ('') podczas przekazywania do@PreAuthorize(...) adnotacja. Jeśli to stwierdzenie nie jest prawdziwe, (1) i (2) nie będą działać. To tylko mój wniosek!

Gdy dojdziemy do (3), sprawa wygląda podobnie do (1) i (2). Wartość w pliku to „hasRole('ROLE_ADMIN')". Po prawidłowym wstrzyknięciu tej wartości, jeśli pojedyncze cytaty zostaną dodane podczas przechodzenia do@PreAuthorize(...)tak będzie@PreAuthorize("'hasRole('ROLE_ADMIN')'"). Więc "'hasRole('ROLE_ADMIN')'„jest łańcuchem, a nie wartością logiczną. To tylko mój podejrzany.

Pytanie:

Czy uważasz, że mój wniosek jest prawidłowy? jeśli nie, czy możesz mi wskazać, czy jest coś, co przegapiłem? Lub daj mi, jeśli masz alternatywne rozwiązania do osiągnięcia@PreAuthorize(...) poprzez wstrzyknięcie wartości z pliku właściwości.

Z góry dziękuję!

Note: to nie jest problem z konfiguracją ani wtryskiem. Sprawdziłem, czy wartości zostały poprawnie wstrzyknięte.

questionAnswers(1)

yourAnswerToTheQuestion