2015-04-02 34 views
1

我建立,從網站上顯示數據庫中的信息的應用程序。該應用程序使用Spring Security進行保護,我的用戶可以擁有不同的角色。記錄應根據當前用戶的角色顯示。例如,我想顯示來自數據庫的書籍。角色X只能看到一些書籍和作用Y了。但角色ADMIN可以看到所有的書籍。如何授權Spring應用程序的服務層?

現在我不知道在哪裏以及如何授權情況。我認爲服務層將是一個很好的地方,但我怎樣才能查詢當前用戶可以訪問的角色。

我的表是這樣的:

book (id, name) 
role (id, name) 
role_book (id, role_id, book_id) 

因此,對於圖書的查詢將SELECT b.id, b.name FROM book b, role r role_book rb WHERE b.id = rb.book_id AND r.id = rb.role_id AND r.name IN (<roles of the current user>)。噹噹前用戶具有ADMIN角色時,我只需選擇數據庫中的所有書籍。

但是我怎麼執行的春季服務方法這些查詢?我認爲這是一項常見的授權任務。有沒有彈簧機制來做到這一點?

回答

2

我會做一個簡單的重新設計,這也將使得數據層的可重用性。這將是這樣的。

服務層

這裏我們以當前用戶的角色,並傳遞給數據層。

Iterable<Book> findAllMyBooks(){ 
... 
    List<String> roles = new ArrayList<>(); 
    Authentication authentication = SecurityContextHolder.getContext()getAuthentication(); 
    for (GrantedAuthority auth : authentication.getAuthorities()) { 
     roles.add(auth.getAuthority()); 
    } 
    bookRepository.findAllByRoles(roles); 
... 
} 

數據層

查詢基於角色的書籍。因此,您可以使用它在管理面板中稍後爲未登錄的用戶提取書籍。

請注意,我沒有時間檢查JPQL查詢。 'ADMIN' IN (:roles)中可能有錯誤。請檢查一下。

@Query("SELECT b FROM Book b INNER JOIN b.roles r WHERE r.name IN (:roles) OR 'ADMIN' IN (:roles)") 
Iterable<Book> findAllByRoles(@Param("roles") List<String> roles); 

實體模型

地圖Many to manyRolesBooks

關係
相關問題