2013-05-05 103 views
1

最近我正在學習Spring。我創建了一個簡單的Web應用程序,基本上應該有2種類型的用戶:Spring MVC - Spring Security - 控制器通用架構 - 最佳實踐

  • 客戶
  • 聯繫

你能想象的應用作爲一個典型的購物web應用程序,其中管理員有權限添加新項目,客戶可以看到列出的項目並添加到他們的購物車。 我的問題是關於系統的通用體系結構,它應該是Spring Framework的最佳實踐示例之一。

我可以在這裏列出的點有關這一建築的決定,你能告訴我,你是否會以另一種方式做這些:

我有2級不同的調度員的servlet。因此,公衆下的網址將用於客戶,管理員將用於管理員。

<servlet-mapping> 
    <servlet-name>public-dispatcher</servlet-name> 
    <url-pattern>/public/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>admin-dispatcher</servlet-name> 
    <url-pattern>/admin/*</url-pattern> 
</servlet-mapping> 

2-在Spring-security.xml文件我有一個這樣的管理認證:

<intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 

(所有的URL /管理之下的行動/將密碼保護)

每個Servlet都有一個viewResolver指向一個不同的文件夾,其中包含jsps:

/WEB-INF/admin-jsp/ (admin jsps) 
/WEB-INF/public-jsp/ (customer jsps) 

4-可以說我有這些域對象:Item,ShoppingCart,Customer等。對於每個域對象,我有一個Controller類,即ItemController,它處理關於某個項目的所有請求(客戶和管理員)。

@Controller 
@RequestMapping("/item") 
@SessionAttributes({"cart"}) 
public class ItemController { ... 

這些決定中的每一個,當我一個一個考慮他們時都是有意義的。但實際上,很顯然,因爲我沒有看到任何大的Spring應用程序(因特網包含很多小代碼部分,它們並不能提供有關整體的信息),所以這裏有些問題..

For Instance:我可以將這個url作爲customer/public/item/addNewItem(實際上是爲管理員)調用,並且該方法將被執行,因爲ItemController(/ item)對每個人都是可見的。但是因爲我在兩個不同的位置有jsps,所以Spring會拋出視圖不存在的錯誤。 同樣作爲一個管理員,當我可以打電話的URL /管理/項目/ addToCart ....

什麼是最好的拱門。實施整體?我應該在安全配置中定義更多的URL嗎?例如:

<intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 
<intercept-url pattern="/admin/addNewItem" access="ROLE_ADMIN" /> 

OR

如果我有不同的角色定義不同的控制器?

@RequestMapping("/public/item") 
    @SessionAttributes({"cart"}) 
    public class PublicItemController { ... 

@RequestMapping("/admin/item") 
    public class AdminItemController { ... 

OR

任何其他方式?在一個有很多角色,控制器等發生的大系統中應該如何實現。

回答

2

我知道我遲到了這個討論(你現在可能已經解決你的問題),但在這裏,這是所有遲來像我:)

使用Spring安全性(或任何安全框架),我們通常控制對我們的應用程序「資源」(可通過​​應用程序URL訪問)的訪問,爲此我們需要一個ROLE-TO-RESOURCE映射。

  1. 它是不是有2周不同的調度員的servlet,除非你有專門的非常有力的理由一個好方法。要使用「Spring Security」,就足夠了。

  2. 這是您應該從頭開始的方法,允許訪問基於用戶ROLE的URL模式。在允許訪問請求的URL之前,Spring安全框架類用於檢查用戶ROLE。

  3. 我們正在保護邏輯資源,我們無論如何都不允許用戶直接訪問我們的物理資源。將您的JSP保存在WEB-INF內,並且您很好。

  4. 對於不同的ROLE,您不需要有不同的控制器。控制器方法用於爲Web請求提供服務,如果用戶不被允許訪問特定的URL,那麼提供該URL的Controller方法將永遠不會被執行。

1

非常有趣的方法。您可以通過爲每個調度程序servlet定義兩個不同的控制器列表來解決實際問題。有多種方法來存檔它,例如:

  1. 而不是使用組件掃描在XML中手動聲明每個控制器。
  2. 如果你有幾個例外,那麼你可以使用filters。創建兩個新註釋,OnlyForAdminControllerOnlyForPublicController。註釋相應的類。然後自定義組件的掃描選項每個調度的servlet:
<!-- For public --> 
<context:component-scan base-package="com.yourproject.conrollers"> 
    <context:exclude-filter type="annotation" expression="com.yourproject.annotation.OnlyForAdminController"/> 
</context:component-scan> 


<!-- For admin --> 
<context:component-scan base-package="com.yourproject.conrollers"> 
    <context:exclude-filter type="annotation" expression="com.yourproject.annotation.OnlyForPublicController"/> 
</context:component-scan> 

在這種類型的(網上商店)的大部分時間,你將有公共和管理用戶的一些特殊要求的真正的系統。例如,在ItemController的情況下,管理員用戶可以看到一些銷售統計作爲附加信息,其中公共用戶可以看到5個之前查看的項目的列表。所以從性能的角度來看,你將有兩個獨立的控制器。在任何情況下,您都可以在可能的情況下重新使用某些控制器,並在稍後請求某些特殊行爲時爲每個用戶分配這些控制器。當你在兩種類型的用戶之間只有很小的差異時,你的技術會更加有趣。

2
  1. 通常在Spring應用程序中有一個調度程序servlet。我不認爲有一個用於公共請求,一個用於管理請求會爲您購買任何東西。

  2. 是的,聽起來不錯

  3. 同樣,我不明白如何分割管理和公共的JSP到不同的目錄是要幫助你。如果您擁有兩個區域共有的JSP,最終可能會讓您感到困惑

  4. 這取決於您的個人偏好。我定義XML我的安全的東西,但很多人更喜歡註解

+0

謝謝。 4.點實際上更多關於控制器類計數專業領域對象,比基於註釋的配置;) – akcasoy 2013-05-06 11:15:39

+0

啊,OK。在這種情況下,我可能會有單獨的控制器的管理員和公共項目控制器。 – ashario 2013-05-07 03:43:35