sec:authorize in js append html as string 不起作用

sec:authorize in js append html as string not work

提问人:wnotunas 提问时间:8/7/2023 最后编辑:wnotunas 更新时间:9/6/2023 访问量:57

问:

我是 JS HTML JQuery ajax 的新手,我目前对我的 HTML 案例有疑问。为了最准确地描述我现在面临的情况,首先我将谈谈这个过程。该项目是关于 SpringMVC + Thymeleaf 和 Thymeleaf Security5 + Spring Security 的。

  • 用户登录时,具有角色 USER 的用户不会看到标记 by ,这首先工作正常sec:acthorize

当具有 USER 角色的用户加载到页面中时,源代码首先工作正常(表示不显示具有 USER 角色的用户的标记):

<tbody id="tableBody">
   <tr>
      <td>
         <a sec:authorize="hasAuthority('ADMIN')" href="#" th:attr="onclick='showConfirmationPopup(\'' + ${user.userName} + '\');'" class="delete" title="Delete" data-toggle="tooltip"></a>
      </td>
   </tr>
</tbody>
  • 但是,在我对调用Ajax JQuery的目录进行排序之后,可以像这样重新创建视图:
function populateTable(data) {
   $("#tableBody").empty();
   var row = $("<tr>");
   var actionColumn = $("<td>");
   actionColumn.append("<a sec:authorize=\"hasAuthority('ADMIN')\" href='/api/update/" + user.userName + "' class='settings' title='Update' data-toggle='tooltip'></a>");
   row.append(actionColumn);
   $("#tableBody").append(row);
}

结果是,尽管当前身份验证用户具有角色 USER,但它仍然显示标记。

调用上述函数的代码是:

   $.ajax({
      url: "/rest/api/pagination-by-search",
      type: "GET",
      data: formData,
      success: function(data) {
         populateTable(data);
      }
   });
   function populateTable(data) {
      $("#tableBody").empty();
      var row = $("<tr>");
      var actionColumn = $("<td>");
      actionColumn.append("<a sec:authorize=\"hasAuthority('ADMIN')\" href='/api/update/" + user.userName + "' class='settings' title='Update' data-toggle='tooltip'></a>");
      row.append(actionColumn);
      $("#tableBody").append(row);
   }

我尝试记录用户的角色,它按预期记录了角色 USER。但是,该视图仍会为具有角色 USER 的用户显示。 我使用的版本:

  • SpringBoot版本:2.7.14
  • thymeleaf-extras-springsecurity5
  • java版本:1.8
JavaScript Java HTML AJAX Spring-thymeleaf

评论


答:

1赞 Nguyễn Ngọc Tân 9/6/2023 #1

似乎您的代码中已经有一个名为 user 的 Thymeleaf 对象。要根据此对象的角色属性有条件地显示链接并使用 Spring Security 对其进行授权,您可以将 和 属性一起使用。th:ifsec:authorize

以下是修改代码的方法:

actionColumn.append("<a th:if=\"${user.role == 'ADMIN'}\" sec:authorize=\"hasAuthority('ADMIN')\" href='/api/update/'" + ${user.userName} + " class='settings' title='Update' data-toggle='tooltip'></a>");

此代码仅在用户对象的 role 属性设置为 时才会呈现链接,并且它还将使用 Spring Security 的 .这应该有助于您根据不同的角色控制链接的可见性。'ADMIN''ADMIN'sec:authorize

评论

1赞 wnotunas 9/6/2023
谢谢,但这种方式似乎暂时有效。
0赞 Nguyễn Ngọc Tân 9/6/2023
是的,但至少它有效。