sec:autorize + thymeleaf 的问题

Problems with sec:autorize + thymeleaf

我想我离解决方案越来越近了,但我仍然相信它。我改变了代码中的一些东西。这是实际代码:

<nav>
    <ul id="topMenu">
        <li th:each="menuItem : ${@mainMenu.getMenuItems()}">
            <div>
                <a th:text="${menuItem.getLabel()}" th:href="${menuItem.getUrl()}" th:sec:authorize="${hasAnyRole(menuItem.getRoles())}"></a>
            </div>
            <ul class="topSubMenu" th:if="${menuItem.getSubItems()} != null">
                <li th:each="subMenu : ${menuItem.getSubItems()}" th:class="${subMenu.getSubItems()} !=null ? 'hpit-topCategory'">
                    <div>
                        <a th:text="${subMenu.getLabel()}" th:href="${subMenu.getUrl()}" style="display:block"></a>
                    </div>
                    <ul class="topSubMenu" th:if="${subMenu.getSubItems()} != null">
                        <li th:each="subCategory : ${subMenu.getSubItems()}">
                            <div>
                                <a th:text="${subCategory.getLabel()}" th:href="${subCategory.getUrl()}"></a>
                            </div>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</nav>

我使用了这样的用户:

<user name="david-gh" password="p" authorities="ROLE_USER,ROLE_ADMIN,ROLE_BLAH" />

和其他用户:

<user name="david-gh2" password="p" authorities="ROLE_USER,ROLE_ADMIN" />

加载的菜单是:

<bean class="web.data.MenuItem">
    <constructor-arg value="Home" />
    <constructor-arg value="/" />
    <constructor-arg value="ROLE_USER" />
</bean>
<bean class="web.data.MenuItem">
    <constructor-arg value="Assessment" />
    <constructor-arg value="###" />
    <constructor-arg value="ROLE_BLAH" />
    <constructor-arg>
        <list>
            <bean class="web.data.MenuItem">
                <constructor-arg value="New Assessment Request" />
                <constructor-arg value="/requestClient" />
                <constructor-arg value="ROLE_USER" />
            </bean>
        </list>
    </constructor-arg>
</bean>

所以应该有的行为是:David-gh 应该看到所有内容,但 david-gh2 不应该看到评估。现在我看到了这两件事所以我的猜测是命令行:

<a th:text="${menuItem.getLabel()}" th:href="${menuItem.getUrl()}" th:sec:authorize="${hasAnyRole(menuItem.getRoles())}"></a>

它不能正常工作,因为 th:sec:authorize="${hasAnyRole(menuItem.getRoles())}" 不能正常工作。

谁能帮帮我???

所以我解决了自己的问题,答案是 thymeleaf 有一个错误,无法处理更正 class 中的信息。为了解决这个问题,我想出了这个解决方案:

<div th:if="${#authorization.expression('hasAnyRole(''__${menuItem.getRoles()}__'')')}">

这不是一件好事,但现在可以用:)