摘要:在本文中,我們將展示如何根據(jù)中定義的用戶角色過(guò)濾序列化輸出。請(qǐng)注意,此方法要求我們?cè)谔幚砭哂卸鄠€(gè)角色的用戶時(shí)要小心。
在本文中,我們將展示如何根據(jù)Spring Security中定義的用戶角色過(guò)濾JSON序列化輸出。
為什么我們需要過(guò)濾?讓我們考慮一個(gè)簡(jiǎn)單但常見(jiàn)的用例,我們有一個(gè)Web應(yīng)用程序,為不同角色的用戶提供服務(wù)。例如,這些角色為User和Admin。
首先,讓我們定義一個(gè)要求,即Admin可以完全訪問(wèn)通過(guò)公共REST API公開(kāi)的對(duì)象的內(nèi)部狀態(tài)。相反,User用戶應(yīng)該只看到一組預(yù)定義的對(duì)象屬性。
我們將使用Spring Security框架來(lái)防止對(duì)Web應(yīng)用程序資源的未授權(quán)訪問(wèn)。
讓我們定義一個(gè)對(duì)象,我們將在API中作為REST響應(yīng)返回?cái)?shù)據(jù):
class Item { private int id; private String name; private String ownerName; // getters }
當(dāng)然,我們可以為應(yīng)用程序中的每個(gè)角色定義一個(gè)多帶帶的數(shù)據(jù)傳輸對(duì)象類。但是,這種方法會(huì)為我們的代碼庫(kù)引入無(wú)用的重復(fù)或復(fù)雜的類層次結(jié)構(gòu)。
另一方面,我們可以使用Jackson庫(kù)的JSON View功能。正如我們將在下一節(jié)中看到的那樣,它使得自定義JSON表示就像在字段上添加注釋一樣簡(jiǎn)單。
@JsonView注釋Jackson庫(kù)支持通過(guò)使用@JsonView注解標(biāo)記我們想要包含在JSON表示中的字段來(lái)定義多個(gè)序列化/反序列化上下文。此注解具有Class類型的必需參數(shù),用于區(qū)分上下文。
使用@JsonView在我們的類中標(biāo)記字段時(shí),我們應(yīng)該記住,默認(rèn)情況下,序列化上下文包括未明確標(biāo)記為視圖一部分的所有屬性。為了覆蓋此行為,我們可以禁用DEFAULT_VIEW_INCLUSION映射器功能。
首先,讓我們定義一個(gè)帶有一些內(nèi)部類的View類,我們將它們用作@JsonView注解的參數(shù):
class View { public static class User {} public static class Admin extends User {} }
接下來(lái),我們將@JsonView注解添加到我們的類中,使ownerName只能訪問(wèn)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 集成
現(xiàn)在,讓我們添加一個(gè)包含所有角色及其名稱的枚舉。之后,讓我們介紹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); } //... }
最后,我們來(lái)到了整合的中心點(diǎn)。為了綁定JSONView和Spring Security角色,我們需要定義適用于我們應(yīng)用程序中所有控制器方法的控制器。
到目前為止,我們唯一需要做的就是覆蓋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(","))); } } }
這樣,我們的應(yīng)用程序的每個(gè)響應(yīng)都將通過(guò)這個(gè)路由,它將根據(jù)我們定義的角色映射找到合適的返回結(jié)果。請(qǐng)注意,此方法要求我們?cè)谔幚砭哂卸鄠€(gè)角色的用戶時(shí)要小心。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73276.html
摘要:建立一個(gè)模塊繼承上一個(gè)模塊然后添加依賴解決打包時(shí)找不到文件建立數(shù)據(jù)源文件數(shù)據(jù)庫(kù)連接相關(guān)修改配置數(shù)據(jù)源和整合,以及事務(wù)管理自動(dòng)掃描掃描時(shí)跳過(guò)注解的類控制器掃描配置文件這里指向的是 1.建立一個(gè)模塊繼承上一個(gè)模塊然后添加依賴 junit junit 4.11 test ...
摘要:創(chuàng)建應(yīng)用有很多方法去創(chuàng)建項(xiàng)目,官方也推薦用在線項(xiàng)目創(chuàng)建工具可以方便選擇你要用的組件,命令行工具當(dāng)然也可以。對(duì)于開(kāi)發(fā)人員最大的好處在于可以對(duì)應(yīng)用進(jìn)行自動(dòng)配置。 使用JWT保護(hù)你的Spring Boot應(yīng)用 - Spring Security實(shí)戰(zhàn) 作者 freewolf 原創(chuàng)文章轉(zhuǎn)載請(qǐng)標(biāo)明出處 關(guān)鍵詞 Spring Boot、OAuth 2.0、JWT、Spring Security、SS...
摘要:創(chuàng)建一個(gè)工程在里面添加依賴,依賴不要隨便改我改了出錯(cuò)了好幾次都找不到原因可以輕松的將對(duì)象轉(zhuǎn)換成對(duì)象和文檔同樣也可以將轉(zhuǎn)換成對(duì)象和配置 1.創(chuàng)建一個(gè)web工程2.在pom里面添加依賴,依賴不要隨便改,我改了出錯(cuò)了好幾次都找不到原因 UTF-8 1.7 1.7 2.5.0 1.2 3.0-alpha-1 ...
摘要:構(gòu)造函數(shù)的第一個(gè)參數(shù)是對(duì)象,所以可以自定義緩存對(duì)象。在微服務(wù)各個(gè)模塊獲取用戶的這些信息的方法如下略權(quán)限控制啟用基于方法的權(quán)限注解簡(jiǎn)單權(quán)限校驗(yàn)例如,刪除角色的接口,僅允許擁有權(quán)限的用戶訪問(wèn)。 showImg(https://segmentfault.com/img/remote/1460000019593311); 微服務(wù)架構(gòu) showImg(https://segmentfault.c...
摘要:的版本增加了對(duì)事件監(jiān)聽(tīng)程序的支持,事件監(jiān)聽(tīng)程序在建立修改和刪除會(huì)話或環(huán)境時(shí)得到通知。元素指出事件監(jiān)聽(tīng)程序類。過(guò)濾器配置將一個(gè)名字與一個(gè)實(shí)現(xiàn)接口的類相關(guān)聯(lián)。 1.簡(jiǎn)介 web.xml文件是Java web項(xiàng)目中的一個(gè)配置文件,主要用于配置歡迎頁(yè)、Filter、Listener、Servlet等,但并不是必須的,一個(gè)java web項(xiàng)目沒(méi)有web.xml文件照樣能跑起來(lái)。Tomcat容器/...
閱讀 2329·2021-09-02 15:11
閱讀 1596·2019-08-30 15:43
閱讀 2146·2019-08-29 13:48
閱讀 2857·2019-08-26 13:55
閱讀 2160·2019-08-23 15:09
閱讀 2959·2019-08-23 14:40
閱讀 3516·2019-08-23 14:23
閱讀 2703·2019-08-23 14:20