2015-05-07 164 views
0

我有一個使用經典三層的控制器服務和dao的Spring MVC應用程序。在Spring MVC中處理cookie

而且該應用程序中的相關型號包含UserDepartmentProject

一個用戶屬於一個部門,可能有很多項目屬於某個部門,各部門之間的組織爲樹狀結構,例如:

dep1 
    dep1-1 
     dep1-1-1 
     dep1-1-2 
     ... 
    ... 
... 

現在我有控制器列出項目:

class ProjectController{ 
    private ProjectService projectService; 
    @RequestMapping("/list") 
    public String list(@RequestParameter("depId") String depId){ 
     projectService.list(depId); 
     return "list"; 
    } 
} 

ProjectServiceImpl implements ProjectService{ 
    ProjectDao projectDao; 
    public List<Department> list(String depId){ 

    } 
} 

看來,這是相當簡單的,但是我們有兩個問題:

1的結果過濾器。

根據該配置,當前用戶的部門可能(或不)正在考慮的查詢操作時,例如,當參數depIddep1-1-1,並且當前用戶屬於dep1-1-2,那麼我們就應該返回空值。

如上所述,在某些情況下,此功能可能完全關閉。

2認證。

用戶認證和管理在另一個應用程序中提供,它將與我的應用程序部署在同一個域中,您可以認爲它們是/tomcat/webapps中的兩個不同的文件夾。我們使用cookie來共享用戶信息:爲用戶保存一個令牌。

這意味着對於每一個請求,我都必須從cookie中獲取當前用戶的token(如果他們已經登錄),然後調用其他應用程序提供的服務來獲取department等信息。

那麼在哪裏做部門檢查,在控制器或服務?我不確定注入HttpRequest是否是一個好主意。

此外,由於控制器和服務與此類操作相關的控制器和服務太多,因此我想避免隨處可見的重複代碼。

有沒有更好的選擇?

回答

0

這可能是矯枉過正,但你問的讓我覺得春天的安全性:

  • 認證:春季安全可以直接做到這一點,但你也可以實現自定義PreauthenticatedAuthenticationFilter,將使用cookie來獲取用戶信息並填充Spring Security Authentication令牌。這部分很容易且高度可配置。
  • 結果過濾器:從彈簧安全參考手冊提取:

    春季安全支持集合和數組的過濾和這個現在可以使用表達式來實現。這通常是對方法的返回值執行的。例如:

    @PreAuthorize("hasRole('ROLE_USER')") 
    @PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')") 
    public List<Contact> getAll(); 
    

    當使用@PostFilter註解,通過返回的集合的Spring Security遍歷並刪除爲其提供的表達式爲假

    所有這一切都是通過Spring AOP中如此實施的任何元素很容易在服務方法中添加這些註釋。

Spring Security很好地集成在Spring MVC應用程序中。唯一的問題是,包括域對象安全性在內的完整配置並不十分微不足道......

+0

好主意,但服務於用戶管理的其他應用程序目前不使用ss,並且有一點改變目前的項目結構。 – hguser

+0

對於'postfilter'來查詢數據庫後會過濾結果,這在我們的應用程序中是不可接受的,因爲查詢可能很複雜,所以我們更喜歡在數據庫級別使用過濾條件。 – hguser