成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

基于Spring Security Role過(guò)濾Jackson JSON輸出內(nèi)容

zhangyucha0 / 3322人閱讀

摘要:在本文中,我們將展示如何根據(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 Map MAPPING = 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 authorities
              = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
            List jsonViews = 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

相關(guān)文章

  • springSecurity02(mybatis+springmvc+spring) 01

    摘要:建立一個(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 ...

    FrancisSoung 評(píng)論0 收藏0
  • 使用JWT保護(hù)你的Spring Boot應(yīng)用 - Spring Security實(shí)戰(zhàn)

    摘要:創(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...

    wemall 評(píng)論0 收藏0
  • SpringSecurity01(使用傳統(tǒng)的xml方式開(kāi)發(fā),且不連接數(shù)據(jù)庫(kù))

    摘要:創(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 ...

    Gilbertat 評(píng)論0 收藏0
  • 基于 Spring Session & Spring Security 微服務(wù)權(quán)限控制

    摘要:構(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...

    clasnake 評(píng)論0 收藏0
  • 關(guān)于web.xml配置的那些事兒

    摘要:的版本增加了對(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容器/...

    zhichangterry 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<