欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security之默認(rèn)的過(guò)濾器鏈及自定義Filter操作

 更新時(shí)間:2021年06月22日 16:31:34   作者:咸魚(yú)最牛逼  
這篇文章主要介紹了Spring Security之默認(rèn)的過(guò)濾器鏈及自定義Filter操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring Security 過(guò)濾器鏈及自定義Filter

別名 類(lèi)名稱(chēng) Namespace Element or Attribute
CHANNEL_FILTER ChannelProcessingFilter http/intercept-url@requires-channel
SECURITY_CONTEXT_FILTER SecurityContextPersistenceFilter http
CONCURRENT_SESSION_FILTER ConcurrentSessionFilter session-management/concurrency-control
HEADERS_FILTER HeaderWriterFilter http/headers
CSRF_FILTER CsrfFilter http/csrf
LOGOUT_FILTER LogoutFilter http/logout
X509_FILTER X509AuthenticationFilter http/x509
PRE_AUTH_FILTER AbstractPreAuthenticatedProcessingFilter( Subclasses) N/A
CAS_FILTER CasAuthenticationFilter N/A
FORM_LOGIN_FILTER UsernamePasswordAuthenticationFilter http/form-login
BASIC_AUTH_FILTER BasicAuthenticationFilter http/http-basic
SERVLET_API_SUPPORT_FILTER SecurityContextHolderAwareRequestFilter http/@servlet-api-provision
JAAS_API_SUPPORT_FILTER JaasApiIntegrationFilter http/@jaas-api-provision
REMEMBER_ME_FILTER RememberMeAuthenticationFilter http/remember-me
ANONYMOUS_FILTER AnonymousAuthenticationFilter http/anonymous
SESSION_MANAGEMENT_FILTER SessionManagementFilter session-management
EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter http
FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor http
SWITCH_USER_FILTER SwitchUserFilter N/A

過(guò)濾器順序從上到下

自定義 Filter

自定義的 Filter 建議繼承 GenericFilterBean,本文示例:

package com.example.filter;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/**
 * @author 咸魚(yú)
 * @date 2019-05-26 18:02
 */
public class BeforeLoginFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("在 UsernamePasswordAuthenticationFilter 前調(diào)用");
        chain.doFilter(request, response);
    }
}

配置自定義 Filter 在 Spring Security 過(guò)濾器鏈中的位置

配置很簡(jiǎn)單,本文示例:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/user/**").hasAuthority("USER")
                .and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/user")
                .and()
                .logout().logoutUrl("/logout").logoutSuccessUrl("/login");
        // 在 UsernamePasswordAuthenticationFilter 前添加 BeforeLoginFilter
        http.addFilterBefore(new BeforeLoginFilter(), UsernamePasswordAuthenticationFilter.class);
        // 在 CsrfFilter 后添加 AfterCsrfFilter
        http.addFilterAfter(new AfterCsrfFilter(), CsrfFilter.class);
    }

說(shuō)明:

HttpSecurity 有三個(gè)常用方法來(lái)配置:

addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter)

在 beforeFilter 之前添加 filter

addFilterAfter(Filter filter, Class<? extends Filter> afterFilter)

在 afterFilter 之后添加 filter

addFilterAt(Filter filter, Class<? extends Filter> atFilter)

在 atFilter 相同位置添加 filter, 此 filter 不覆蓋 filter

通過(guò)在不同 Filter 的 doFilter() 方法中加斷點(diǎn)調(diào)試,可以判斷哪個(gè) filter 先執(zhí)行,從而判斷 filter 的執(zhí)行順序 。

spring security添加自定義過(guò)濾器

1、定義自己的過(guò)濾器

2、指定位置,通過(guò)HttpSecurity的方法指定

定義過(guò)濾器

package com.qiudaozhang.springsecurity.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestHeadCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        var httpRequest = (HttpServletRequest) servletRequest;
        var httpResponse = (HttpServletResponse) servletResponse;
        String requestId = httpRequest.getHeader("Request-id");
        if(requestId == null || requestId.isBlank()) {
            httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
package com.qiudaozhang.springsecurity.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestParamCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        var httpRequest = (HttpServletRequest) servletRequest;
        var httpResponse = (HttpServletResponse) servletResponse;
        String timestamp = httpRequest.getParameter("timestamp");
        if(timestamp == null || timestamp.isBlank()) {
            httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return;
        }
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

指定位置

HttpSecurity中有兩個(gè)方法,指定過(guò)濾器的位置,一個(gè)指定在誰(shuí)前面,一個(gè)指定在誰(shuí)后面。

   public HttpSecurity addFilterAfter(Filter filter, Class<? extends Filter> afterFilter) {
       this.comparator.registerAfter(filter.getClass(), afterFilter);
       return this.addFilter(filter);
   }
   public HttpSecurity addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter) {
       this.comparator.registerBefore(filter.getClass(), beforeFilter);
       return this.addFilter(filter);
   }
package com.qiudaozhang.springsecurity.config;
import com.qiudaozhang.springsecurity.filter.RequestHeadCheckFilter;
import com.qiudaozhang.springsecurity.filter.RequestParamCheckFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(
                new RequestHeadCheckFilter(),
                BasicAuthenticationFilter.class
        )
                .addFilterAfter(new RequestParamCheckFilter(),BasicAuthenticationFilter.class)
                .authorizeRequests()
                .anyRequest()
                .permitAll();
    }
}

測(cè)試

準(zhǔn)備一個(gè)端點(diǎn)測(cè)試

package com.qiudaozhang.springsecurity.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @GetMapping("hello")
    public String hello () {
        return "hello";
    }
}

在這里插入圖片描述

當(dāng)前沒(méi)有傳遞timestamp參數(shù),所以參照約定,過(guò)濾器直接給出403.

在這里插入圖片描述

當(dāng)前頭部信息和參數(shù)信息都提供了,檢測(cè)通過(guò)。

實(shí)際應(yīng)用場(chǎng)景 檢測(cè)相關(guān)的頭部,參數(shù)等等信息日志過(guò)濾器,將所有請(qǐng)求的相關(guān)數(shù)據(jù)記錄下來(lái)特殊的權(quán)限校驗(yàn)等等。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis中如何使用小于號(hào)

    mybatis中如何使用小于號(hào)

    這篇文章主要介紹了mybatis中如何使用小于號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java Feign微服務(wù)接口調(diào)用方法詳細(xì)講解

    Java Feign微服務(wù)接口調(diào)用方法詳細(xì)講解

    現(xiàn)如今微服務(wù)架構(gòu)十分流行,而采用微服務(wù)構(gòu)建系統(tǒng)也會(huì)帶來(lái)更清晰的業(yè)務(wù)劃分和可擴(kuò)展性。java如果使用微服務(wù)就離不開(kāi)springcloud,我這里是把服務(wù)注冊(cè)到nacos上,各個(gè)服務(wù)之間的調(diào)用使用feign
    2023-01-01
  • Spring?boot?security權(quán)限管理集成cas單點(diǎn)登錄功能的實(shí)現(xiàn)

    Spring?boot?security權(quán)限管理集成cas單點(diǎn)登錄功能的實(shí)現(xiàn)

    這篇文章主要介紹了Spring?boot?security權(quán)限管理集成cas單點(diǎn)登錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 詳解JAVA之運(yùn)算符

    詳解JAVA之運(yùn)算符

    這篇文章主要介紹了詳解Java中運(yùn)算符以及相關(guān)的用法講解,一起跟著小編學(xué)習(xí)下吧,希望能夠給你帶來(lái)幫助
    2021-11-11
  • SpringBoot 自動(dòng)配置失效的解決方法

    SpringBoot 自動(dòng)配置失效的解決方法

    本文主要介紹了SpringBoot 自動(dòng)配置失效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼

    java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 詳解Java前綴樹(shù)Trie的原理及代碼實(shí)現(xiàn)

    詳解Java前綴樹(shù)Trie的原理及代碼實(shí)現(xiàn)

    Trie又被稱(chēng)為前綴樹(shù)、字典樹(shù)。Trie利用字符串的公共前綴來(lái)高效地存儲(chǔ)和檢索字符串?dāng)?shù)據(jù)集中的關(guān)鍵詞,最大限度地減少無(wú)謂的字符串比較,其核心思想是用空間換時(shí)間。本文主要介紹了Trie的原理及實(shí)現(xiàn),感興趣的可以了解一下
    2022-11-11
  • springboot?接收LocalDateTime方式

    springboot?接收LocalDateTime方式

    這篇文章主要介紹了springboot?接收LocalDateTime方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java 多線程饑餓現(xiàn)象的問(wèn)題解決方法

    java 多線程饑餓現(xiàn)象的問(wèn)題解決方法

    這篇文章主要介紹了java 多線程饑餓現(xiàn)象的問(wèn)題解決方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 解決maven沒(méi)有打包xml文件的問(wèn)題

    解決maven沒(méi)有打包xml文件的問(wèn)題

    這篇文章主要介紹了解決maven沒(méi)有打包xml文件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論