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