@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.Boolean
java.lang.IllegalArgumentException: Invalid boolean value 'hasRole('ROLE_ADMIN')'
私の結論:
上記の(1)と(2)から、1つのことがわかるかもしれません。つまり、注入された値は、@PreAuthorize(...)
アノテーションに渡されるときに単一引用符 (' ') で囲まれているようです。このステートメントが正しくない場合、(1) と (2) は機能しません。そのちょうど私の結論!.
(3) になると、ケースは (1) と (2) に似ているように見えます。ファイル内の値は " hasRole('ROLE_ADMIN')
" です。この値を正しく注入した後、 に渡すときにシングル クォーテーションを追加すると、 の@PreAuthorize(...)
ようになります@PreAuthorize("'hasRole('ROLE_ADMIN')'")
。したがって'hasRole('ROLE_ADMIN')'
、「」はブール値ではなく文字列です。それはただの私の容疑者です。
質問:
私の結論は正しいと思いますか?そうでない場合、私が見逃しているものがあれば指摘してもらえますか? @PreAuthorize(...)
または、プロパティ ファイルから値を挿入することで達成できる別の解決策があれば教えてください。
前もって感謝します!
Note
: 構成の問題でもインジェクションの問題でもありません。値が正しく注入されていることを確認しました。