最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

首頁(yè) 慕課教程 Spring Security Spring Security Servlet 實(shí)現(xiàn)鑒權(quán)

Spring Security 在 Servlet 請(qǐng)求中實(shí)現(xiàn)鑒權(quán)

1. 前言

Servlet 是 Java Web 應(yīng)用的最常見(jiàn)場(chǎng)景,Spring Security 對(duì) Servlet 的權(quán)限認(rèn)定過(guò)程實(shí)現(xiàn)了規(guī)范化和流程化。

本節(jié)主要討論在 Servlet 應(yīng)用中,如何通過(guò) Spring Security 實(shí)現(xiàn)鑒權(quán)。

2. Servlet 權(quán)限控制的流程

Servlet 鑒權(quán)主要圍繞著 FilterSecurityInterceptor 類展開,該類作為一個(gè)安全過(guò)濾器,被放置在 FilterChainProxy 中。

圖片描述

圖 1. Servlet 請(qǐng)求鑒權(quán)流程

具體流程如下:

  1. FilterSecurityInterceptorSecurityContextHolder 中獲取 Authentication 對(duì)象;
  2. FilterSecurityInterceptorHttpServletRequest、HttpServletREsponseFilterChain 中創(chuàng)建 FilterInvocation 對(duì)象;
  3. 將創(chuàng)建的 FilterInvocation 對(duì)象傳遞給 SecurityMetadataSource 用來(lái)獲取 ConfigAttribute 對(duì)象集合;
  4. 最后,將 Authentication、FilterInvocationConfigAttribute 對(duì)象傳遞給 AccessDecisionManager 實(shí)例驗(yàn)證權(quán)限:
    • 如果驗(yàn)證失敗,將拋出 AccessDeniedException 異常,并由 ExceptionTranslationFilter 接收并處理;
    • 如果驗(yàn)證通過(guò),FilterSecurityInterceptor 將控制權(quán)交還給 FilterChain,使程序繼續(xù)執(zhí)行。

3. Servlet 權(quán)限控制的配置實(shí)現(xiàn)

默認(rèn)情況下,Spring Security 的權(quán)限要求所有的請(qǐng)求都需要首先通過(guò)認(rèn)證。相當(dāng)于以下配置描述:

protected void configure(HttpSecurity http) throws Exception {
    http
        // ...
        .authorizeRequests(authorize -> authorize
            .anyRequest().authenticated()
        );
}

如果我們需要配置 Spring Security 對(duì)不同請(qǐng)求有不同的處理規(guī)則時(shí),可通過(guò)以下方式修改配置:

protected void configure(HttpSecurity http) throws Exception {
    http
        // ...
        .authorizeRequests(authorize -> authorize                                  
            .mvcMatchers("/resources/**", "/signup", "/about").permitAll()         
            .mvcMatchers("/admin/**").hasRole("ADMIN")                             
            .mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")   
            .anyRequest().denyAll()                                                
        );
}

以上這段代碼實(shí)現(xiàn)了如下功能:

  1. 指定了多種規(guī)則,每種規(guī)則按照其配置的順序決定優(yōu)先級(jí);
  2. 匹配了多個(gè) URL 規(guī)則,對(duì)于 /resources/signup、/about 允許任何用戶訪問(wèn);
  3. 任何以 /admin/ 開頭的地址都要求用戶具有管理員權(quán)限 ROLE_ADMIN,其中 ROLE_ 前綴是 Spring Security 默認(rèn)添加的,用戶無(wú)需做特殊處理;
  4. 任何以 /db/ 為開頭的地址需要同時(shí)擁有 ROLE_ADMINROLE_DBA 角色;
  5. 沒(méi)有被上述 URL 地址匹配的地址都將被禁止訪問(wèn),加上這一條非常有助于提升系統(tǒng)的安全性。

4. 小結(jié)

本節(jié)討論了如何用 Spring Security 規(guī)范化 Servlet 鑒權(quán)過(guò)程:

  • Spring Security 對(duì) Servlet 請(qǐng)求的權(quán)限控制,主要依賴于 FilterSecurityInterceptor 實(shí)現(xiàn);
  • Spring Security 默認(rèn)對(duì)每一個(gè) Servlet 請(qǐng)求都要求用戶已通過(guò)認(rèn)證;
  • Spring Security 支持對(duì) Servlet 的不同 URL 規(guī)則配置不同的權(quán)限規(guī)則。

下節(jié)我們討論如何通過(guò)「訪問(wèn)控制表達(dá)式」實(shí)現(xiàn)多樣化的鑒權(quán)規(guī)則。