簡體   English   中英

使用Spring MVC和Spring Security填充基於用戶角色的模型

[英]Populating a Model based on User Role with Spring MVC and Spring Security

我在基於Spring Security管理的用戶角色的Spring MVC應用程序中填充模型內容時遇到問題。

在我的應用程序(簡化示例)中,我定義了兩個角色:ROLE_USER和ROLE_ADMIN。 我還有一個頁面,顯示兩個單獨的對象列表:讀者(僅適用於ADMIN)和書籍(針對ADMIN和USER)。

在JSP頁面中有條件顯示列表沒有問題,但是我需要先准備模型,並且如果當前用戶不是ADMIN,也不想加載閱讀器列表。

我曾考慮過在Java代碼中使用Spring EL來確定用戶是否已指定角色(hasRole('ROLE_ADMIN')),但是我找不到手動評估該代碼的方法。

有什么方法可以在控制器源代碼中調用Spring EL處理程序,或者有一種比在Java代碼中直接檢查角色更好的解決方案(在體系結構或設計模式級別上)用於有條件地填充模型。

@Chepech和@Boris Kirzner在使用@PreAuthorize Annotation進行的防止異常的方法調用中解決了此問題。 這樣,當AccessDeniedException發生時,您可以返回null(在您的情況下為空列表)。

一種方法是在生成模型時只返回所有內容,然后依靠@PostFilter根據角色過濾結果。 如果您不想走這條路,則可以讓您的控制器調出另一個bean來構建模型的特定部分,並且另一個bean可以附加角色注釋。 如果不使用對象,那將有效地限制您創建對象。

如果有條件地顯示頁面部件是由JSP頁面控制的,則模型的條件填充應由控制器完成(因為JSP頁面和Controller在視圖層中緊密耦合)。 如果我們在服務層中使用批注,它將把責任放在應用程序的錯誤層(在服務層而不是視圖層)。

我的最終解決方案基於將一組“用戶角色”作為用戶會話屬性:

/* This is executed once, after user successful login. */

Set<String> roles = new HashSet<String>();
for (GrantedAuthority authority : authentication.getAuthorities()) {
   roles.add(authority.getAuthority());
}

session.setAttribute("userRoles", roles);

然后,如果要有條件地填充模型,則只需檢查該Set是否包含所需的角色。

Set<String> roles = (Set<String>) session.getAttribute("userRoles");
if(roles.contains("ROLE_ADMIN")) {
    putReadersInModel(model);
}

我認為解決方案是干凈的,並負責在Controller中正確填充模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM