使用 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.
不能保证
如何使用 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.