摘要:在本文中,我們將展示如何根據中定義的用戶角色過濾序列化輸出。請注意,此方法要求我們在處理具有多個角色的用戶時要小心。
在本文中,我們將展示如何根據Spring Security中定義的用戶角色過濾JSON序列化輸出。
為什么我們需要過濾?讓我們考慮一個簡單但常見的用例,我們有一個Web應用程序,為不同角色的用戶提供服務。例如,這些角色為User和Admin。
首先,讓我們定義一個要求,即Admin可以完全訪問通過公共REST API公開的對象的內部狀態。相反,User用戶應該只看到一組預定義的對象屬性。
我們將使用Spring Security框架來防止對Web應用程序資源的未授權訪問。
讓我們定義一個對象,我們將在API中作為REST響應返回數據:
class Item { private int id; private String name; private String ownerName; // getters }
當然,我們可以為應用程序中的每個角色定義一個多帶帶的數據傳輸對象類。但是,這種方法會為我們的代碼庫引入無用的重復或復雜的類層次結構。
另一方面,我們可以使用Jackson庫的JSON View功能。正如我們將在下一節中看到的那樣,它使得自定義JSON表示就像在字段上添加注釋一樣簡單。
@JsonView注釋Jackson庫支持通過使用@JsonView注解標記我們想要包含在JSON表示中的字段來定義多個序列化/反序列化上下文。此注解具有Class類型的必需參數,用于區分上下文。
使用@JsonView在我們的類中標記字段時,我們應該記住,默認情況下,序列化上下文包括未明確標記為視圖一部分的所有屬性。為了覆蓋此行為,我們可以禁用DEFAULT_VIEW_INCLUSION映射器功能。
首先,讓我們定義一個帶有一些內部類的View類,我們將它們用作@JsonView注解的參數:
class View { public static class User {} public static class Admin extends User {} }
接下來,我們將@JsonView注解添加到我們的類中,使ownerName只能訪問admin角色:
@JsonView(View.User.class) private int id; @JsonView(View.User.class) private String name; @JsonView(View.Admin.class) private String ownerName;如何將@JsonView注解與Spring Security 集成
現在,讓我們添加一個包含所有角色及其名稱的枚舉。之后,讓我們介紹JSONView和安全角色之間的映射:
enum Role { ROLE_USER, ROLE_ADMIN } class View { public static final MapMAPPING = new HashMap<>(); static { MAPPING.put(Role.ADMIN, Admin.class); MAPPING.put(Role.USER, User.class); } //... }
最后,我們來到了整合的中心點。為了綁定JSONView和Spring Security角色,我們需要定義適用于我們應用程序中所有控制器方法的控制器。
到目前為止,我們唯一需要做的就是覆蓋AbstractMappingJacksonResponseBodyAdvice類的 beforeBodyWriteInternal方法:
@RestControllerAdvice class SecurityJsonViewControllerAdvice extends AbstractMappingJacksonResponseBodyAdvice { @Override protected void beforeBodyWriteInternal( MappingJacksonValue bodyContainer, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { if (SecurityContextHolder.getContext().getAuthentication() != null && SecurityContextHolder.getContext().getAuthentication().getAuthorities() != null) { Collection extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); ListjsonViews = authorities.stream() .map(GrantedAuthority::getAuthority) .map(AppConfig.Role::valueOf) .map(View.MAPPING::get) .collect(Collectors.toList()); if (jsonViews.size() == 1) { bodyContainer.setSerializationView(jsonViews.get(0)); return; } throw new IllegalArgumentException("Ambiguous @JsonView declaration for roles " + authorities.stream() .map(GrantedAuthority::getAuthority).collect(Collectors.joining(","))); } } }
這樣,我們的應用程序的每個響應都將通過這個路由,它將根據我們定義的角色映射找到合適的返回結果。請注意,此方法要求我們在處理具有多個角色的用戶時要小心。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73276.html
摘要:建立一個模塊繼承上一個模塊然后添加依賴解決打包時找不到文件建立數據源文件數據庫連接相關修改配置數據源和整合,以及事務管理自動掃描掃描時跳過注解的類控制器掃描配置文件這里指向的是 1.建立一個模塊繼承上一個模塊然后添加依賴 junit junit 4.11 test ...
摘要:創建應用有很多方法去創建項目,官方也推薦用在線項目創建工具可以方便選擇你要用的組件,命令行工具當然也可以。對于開發人員最大的好處在于可以對應用進行自動配置。 使用JWT保護你的Spring Boot應用 - Spring Security實戰 作者 freewolf 原創文章轉載請標明出處 關鍵詞 Spring Boot、OAuth 2.0、JWT、Spring Security、SS...
摘要:創建一個工程在里面添加依賴,依賴不要隨便改我改了出錯了好幾次都找不到原因可以輕松的將對象轉換成對象和文檔同樣也可以將轉換成對象和配置 1.創建一個web工程2.在pom里面添加依賴,依賴不要隨便改,我改了出錯了好幾次都找不到原因 UTF-8 1.7 1.7 2.5.0 1.2 3.0-alpha-1 ...
摘要:構造函數的第一個參數是對象,所以可以自定義緩存對象。在微服務各個模塊獲取用戶的這些信息的方法如下略權限控制啟用基于方法的權限注解簡單權限校驗例如,刪除角色的接口,僅允許擁有權限的用戶訪問。 showImg(https://segmentfault.com/img/remote/1460000019593311); 微服務架構 showImg(https://segmentfault.c...
摘要:的版本增加了對事件監聽程序的支持,事件監聽程序在建立修改和刪除會話或環境時得到通知。元素指出事件監聽程序類。過濾器配置將一個名字與一個實現接口的類相關聯。 1.簡介 web.xml文件是Java web項目中的一個配置文件,主要用于配置歡迎頁、Filter、Listener、Servlet等,但并不是必須的,一個java web項目沒有web.xml文件照樣能跑起來。Tomcat容器/...
閱讀 2185·2021-09-02 15:11
閱讀 1507·2019-08-30 15:43
閱讀 2073·2019-08-29 13:48
閱讀 2790·2019-08-26 13:55
閱讀 2100·2019-08-23 15:09
閱讀 2896·2019-08-23 14:40
閱讀 3422·2019-08-23 14:23
閱讀 2632·2019-08-23 14:20