th:remove 中的 hasRole() 不起作用
Posted
技术标签:
【中文标题】th:remove 中的 hasRole() 不起作用【英文标题】:hasRole() within th:remove is not working 【发布时间】:2018-04-23 19:58:55 【问题描述】:我想禁用特定链接但保留其文本,使其看起来像是被禁用。我正在尝试在锚标记内放置具有特定条件的 th:remove 。我在 ThymeLeaf 教程页面上找到了这个:
<a href="/something" th:remove="$condition? tag">Link text not to be removed</a>
基于此,我正在尝试这样做:
<li>
<a th:href="@/config/mod/"
th:remove="$#authorization.expression('hasRole(''VIEW_MODULE_STATUS'')')? tag">
<i class="fa fa-gear"></i> [[#webadmin.view.config.module.title.short]]
</a>
</li>
其中 VIEW_MODULE_STATUS 是角色。这种情况似乎不起作用,我不明白为什么。
仅供参考:我在锚标记中使用了sec:authorize="hasRole('VIEW_MODULE_STATUS')"
,它工作正常。我想避免这种方法,因为它完全删除了文本和链接。有没有其他方法可以禁用链接并使用 ThymeLeaf 保留文本?
(我使用的是百里香3.0)
【问题讨论】:
【参考方案1】:表达式th:remove="$#authorization.expression('hasRole(''VIEW_MODULE_STATUS'')')? tag"
中使用的三元运算符有误
三元运算符的形式为condition? 'true' : 'false'
。所以你必须更新你的表达。然后你不能禁用<a>
标签,你唯一能做的就是将它的href
属性更新为#
或javascript:void(0);
,这样它就没有任何动作了。你可以这样做:
th:href="$#authorization.expression('hasRole(''VIEW_MODULE_STATUS'')') ? '/something' : '#'"
【讨论】:
感谢您的快速回复。我试过了,它不工作。这是我的 th:ref:th:href="$#authorization.expression('hasAuthority(''VIEW_MODULE_STATUS'')') ? @/config/mod/ : '#'"
您不能在$
中使用@
。您必须将其写为:@$
我的错。这也不起作用:th:href="@$#authorization.expression('hasAuthority(''VIEW_MODULE_STATUS'')') ? /config/mod/ : '#'"
为什么/config/mod
在
中。只需将它们放在''
之间,例如/config/mod/
哇!那行得通。这是我的最终版本:th:href="@$#authorization.expression('hasAuthority(''VIEW_MODULE_STATUS'')') ? '/config/mod/' : '#'"
不过有一个问题:当鼠标悬停在文本上时,鼠标看起来仍然像一只手,表明它是一个链接,但是当它点击时没有任何反应。这正常吗?以上是关于th:remove 中的 hasRole() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security with hibernate:hasRole() 在配置中不起作用
Spring security 4 @PreAuthorize("hasRole()") 不起作用
Spring security + JWT + 经过身份验证并且 hasRole 不起作用?
Spring Security:hasAuthority、hasRole 和 PreAuthorize 不起作用