成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

zhangyucha0 / 3267人閱讀

摘要:在本文中,我們將展示如何根據(jù)中定義的用戶角色過濾序列化輸出。請注意,此方法要求我們在處理具有多個角色的用戶時要小心。

在本文中,我們將展示如何根據(jù)Spring Security中定義的用戶角色過濾JSON序列化輸出。

為什么我們需要過濾?

讓我們考慮一個簡單但常見的用例,我們有一個Web應(yīng)用程序,為不同角色的用戶提供服務(wù)。例如,這些角色為User和Admin。

首先,讓我們定義一個要求,即Admin可以完全訪問通過公共REST API公開的對象的內(nèi)部狀態(tài)。相反,User用戶應(yīng)該只看到一組預(yù)定義的對象屬性。

我們將使用Spring Security框架來防止對Web應(yīng)用程序資源的未授權(quán)訪問。

讓我們定義一個對象,我們將在API中作為REST響應(yīng)返回?cái)?shù)據(jù):

class Item {
    private int id;
    private String name;
    private String ownerName;
 
    // getters
}

當(dāng)然,我們可以為應(yīng)用程序中的每個角色定義一個多帶帶的數(shù)據(jù)傳輸對象類。但是,這種方法會為我們的代碼庫引入無用的重復(fù)或復(fù)雜的類層次結(jié)構(gòu)。

另一方面,我們可以使用Jackson庫的JSON View功能。正如我們將在下一節(jié)中看到的那樣,它使得自定義JSON表示就像在字段上添加注釋一樣簡單。

@JsonView注釋

Jackson庫支持通過使用@JsonView注解標(biāo)記我們想要包含在JSON表示中的字段來定義多個序列化/反序列化上下文。此注解具有Class類型的必需參數(shù),用于區(qū)分上下文。

使用@JsonView在我們的類中標(biāo)記字段時,我們應(yīng)該記住,默認(rèn)情況下,序列化上下文包括未明確標(biāo)記為視圖一部分的所有屬性。為了覆蓋此行為,我們可以禁用DEFAULT_VIEW_INCLUSION映射器功能。

首先,讓我們定義一個帶有一些內(nèi)部類的View類,我們將它們用作@JsonView注解的參數(shù):

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 集成

現(xiàn)在,讓我們添加一個包含所有角色及其名稱的枚舉。之后,讓我們介紹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);
    }
 
    //...
}

最后,我們來到了整合的中心點(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)用程序的每個響應(yīng)都將通過這個路由,它將根據(jù)我們定義的角色映射找到合適的返回結(jié)果。請注意,此方法要求我們在處理具有多個角色的用戶時要小心。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73276.html

相關(guān)文章

  • springSecurity02(mybatis+springmvc+spring) 01

    摘要:建立一個模塊繼承上一個模塊然后添加依賴解決打包時找不到文件建立數(shù)據(jù)源文件數(shù)據(jù)庫連接相關(guān)修改配置數(shù)據(jù)源和整合,以及事務(wù)管理自動掃描掃描時跳過注解的類控制器掃描配置文件這里指向的是 1.建立一個模塊繼承上一個模塊然后添加依賴 junit junit 4.11 test ...

    FrancisSoung 評論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)然也可以。對于開發(fā)人員最大的好處在于可以對應(yīng)用進(jìn)行自動配置。 使用JWT保護(hù)你的Spring Boot應(yīng)用 - Spring Security實(shí)戰(zhàn) 作者 freewolf 原創(chuàng)文章轉(zhuǎn)載請標(biāo)明出處 關(guān)鍵詞 Spring Boot、OAuth 2.0、JWT、Spring Security、SS...

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

    摘要:創(chuàng)建一個工程在里面添加依賴,依賴不要隨便改我改了出錯了好幾次都找不到原因可以輕松的將對象轉(zhuǎn)換成對象和文檔同樣也可以將轉(zhuǎn)換成對象和配置 1.創(chuàng)建一個web工程2.在pom里面添加依賴,依賴不要隨便改,我改了出錯了好幾次都找不到原因 UTF-8 1.7 1.7 2.5.0 1.2 3.0-alpha-1 ...

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

    摘要:構(gòu)造函數(shù)的第一個參數(shù)是對象,所以可以自定義緩存對象。在微服務(wù)各個模塊獲取用戶的這些信息的方法如下略權(quán)限控制啟用基于方法的權(quán)限注解簡單權(quán)限校驗(yàn)例如,刪除角色的接口,僅允許擁有權(quán)限的用戶訪問。 showImg(https://segmentfault.com/img/remote/1460000019593311); 微服務(wù)架構(gòu) showImg(https://segmentfault.c...

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

    摘要:的版本增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立修改和刪除會話或環(huán)境時得到通知。元素指出事件監(jiān)聽程序類。過濾器配置將一個名字與一個實(shí)現(xiàn)接口的類相關(guān)聯(lián)。 1.簡介 web.xml文件是Java web項(xiàng)目中的一個配置文件,主要用于配置歡迎頁、Filter、Listener、Servlet等,但并不是必須的,一個java web項(xiàng)目沒有web.xml文件照樣能跑起來。Tomcat容器/...

    zhichangterry 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<