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()}__'')')}">
这不是一件好事,但现在可以用:)
我想我离解决方案越来越近了,但我仍然相信它。我改变了代码中的一些东西。这是实际代码:
<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()}__'')')}">
这不是一件好事,但现在可以用:)