2011-04-22 37 views
1

我有填充在Spring MVC應用程序中的模型內容的基礎上,由春季安全管理用戶角色的問題,用戶角色模型。填充基於與Spring MVC和Spring Security的

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

有在JSP頁面中有條件地顯示錶沒有問題,但我需要先準備好模型,我不希望加載讀者名單,如果當前用戶不是ADMIN。我想過在Java代碼中使用Spring EL來確定用戶是否指定角色(hasRole('ROLE_ADMIN')),但我找不到手動評估該代碼的方法。

是否有某種方式來調用春EL處理程序控制器的源代碼,或者可能存在有條件地填充模型,不是在Java代碼中直接檢查角色更好的解決方案(在建築或設計模式級)。

回答

-1

如果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<String> roles = (Set<String>) session.getAttribute("userRoles"); 
if(roles.contains("ROLE_ADMIN")) { 
    putReadersInModel(model); 
} 

我認爲解決方案是乾淨的,並保持模型在控制器中正確填充的責任。

0

一種方法是隻返回的一切,當你生成你的模型,然後依靠@PostFilter過濾基於角色的結果。如果你不想走這條路線,你可以讓你的控制器調用另一個bean來構建模型的特定部分,而另一個bean可以附加角色註釋。如果它們不被使用,這將有效地限制你創建對象。

+0

感謝您的建議。不幸的是,你的解決方案都有缺陷,首先在性能上下文中存在問題,其次,對註釋方法的調用將導致安全異常,這不是控制程序流的最明顯的方式。雖然他們都會提供所需的效果,但我正在尋找更清潔的解決方案。 – 2011-04-22 18:45:26

+0

我認爲這將是很好的註釋,如果用戶沒有正確的權限,它會導致方法返回一個預定義的值(在我的情況下是一個空列表),而不執行該方法體。但那只是一廂情願的想法;) – 2011-04-22 18:51:03