使用 Freemarker 将字符串与 Spring 安全标记进行比较

Compare String with Spring Security tag using Freemarker

如何使用 Freemarker 和 Spring 安全标签库实现以下目标?

<#if "[]" == <@security.authentication property='principal.userAccount.administratedVendors'/> >
    <a href="/my-accounts">My Accounts</a>
</#if>

目前,以上代码无法编译。

这里问题的根源是 security.authentication 不应该是 FreeMarker 指令,而是 FreeMarker 函数或方法。指令没有 return 值(因此您不能像您那样使用它们代替表达式)。指令可以打印到输出(以及其他),但这只是一个 "side effect",而不是 return 值。 FreeMarker functions/methods 有一个 return 值。但是如果 Spring 集成不提供与 function/method 相同的调用(检查),那么你能做的最好的就是这个丑陋的解决方法:

<#assign capturedOutput><@security.authentication property='principal.userAccount.administratedVendors'/></#assign>
<#if capturedOutput == '[]'>
  <a href="/my-accounts">My Accounts</a>
</#if>

理论上它有点脆弱,因为(我猜)principal.userAccount 只是打印 属性 值对象的 toString()。虽然对于大多数 return "[]" 空列表的 List 实现,Java API.

不能保证