最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的Spring Security配置過(guò)濾器

 更新時(shí)間:2022年05月23日 14:11:32   作者:? 碼農(nóng)小胖哥?  ?  
這篇文章主要介紹了Java中的Spring Security配置過(guò)濾器,文章通過(guò)圍繞文章主題的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言:

CaptchaAuthenticationFilter是通過(guò)模仿UsernamePasswordAuthenticationFilter實(shí)現(xiàn)的。同樣的道理,由于UsernamePasswordAuthenticationFilter的配置是由FormLoginConfigurer來(lái)完成的,應(yīng)該也能模仿一下FormLoginConfigurer,寫(xiě)一個(gè)配置類(lèi)CaptchaAuthenticationFilterConfigurer去配置CaptchaAuthenticationFilter

public final class FormLoginConfigurer<H extends HttpSecurityBuilder<H>> extends
		AbstractAuthenticationFilterConfigurer<H, FormLoginConfigurer<H>, UsernamePasswordAuthenticationFilter> {
 
    // 省略
}    

AbstractAuthenticationFilterConfigurer

FormLoginConfigurer看起來(lái)有點(diǎn)復(fù)雜,不過(guò)繼承關(guān)系并不復(fù)雜,只繼承了AbstractAuthenticationFilterConfigurer。

public abstract class AbstractAuthenticationFilterConfigurer<B extends HttpSecurityBuilder<B>, T extends AbstractAuthenticationFilterConfigurer<B, T, F>, F extends AbstractAuthenticationProcessingFilter>
		extends AbstractHttpConfigurer<T, B> {
}    

理論上我們模仿一下,也繼承一下這個(gè)類(lèi),但是你會(huì)發(fā)現(xiàn)這種方式行不通。因?yàn)?code>AbstractAuthenticationFilterConfigurer只能Spring Security內(nèi)部使用,不建議自定義。原因在于它最終向HttpSecurity添加過(guò)濾器使用的是HttpSecurity.addFilter(Filter)方法,這個(gè)方法只有內(nèi)置過(guò)濾器(參見(jiàn)FilterOrderRegistration)才能使用。了解了這個(gè)機(jī)制之后,我們只能往上再抽象一層,去改造其父類(lèi)AbstractHttpConfigurer。

改造過(guò)程

AbstractAuthenticationFilterConfigurer<B,T,F>中的B是實(shí)際指的HttpSecurity,因此這個(gè)要保留;

T指的是它本身的實(shí)現(xiàn),我們配置CaptchaAuthenticationFilter不需要下沉一層到FormLoginConfigurer這個(gè)繼承級(jí)別,直接在AbstractAuthenticationFilterConfigurer這個(gè)繼承級(jí)別實(shí)現(xiàn)即可,因此T這里指的就是需要配置類(lèi)本身,也不需要再抽象化,因此是不需要的;同樣的原因F也不需要,很明確是CaptchaAuthenticationFilter,不需要再泛化。這樣CaptchaAuthenticationFilter的配置類(lèi)結(jié)構(gòu)可以這樣定義:

public class CaptchaAuthenticationFilterConfigurer<H extends HttpSecurityBuilder<H>> extends AbstractHttpConfigurer<CaptchaAuthenticationFilterConfigurer<H>, H> {
    // 不再泛化  具體化 
    private final CaptchaAuthenticationFilter authFilter;
    // 特定的驗(yàn)證碼用戶(hù)服務(wù)
    private CaptchaUserDetailsService captchaUserDetailsService;
    // 驗(yàn)證碼處理服務(wù)
    private CaptchaService captchaService;
    // 保存認(rèn)證請(qǐng)求細(xì)節(jié)的策略 
    private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource;
    // 默認(rèn)使用保存請(qǐng)求認(rèn)證成功處理器 
    private SavedRequestAwareAuthenticationSuccessHandler defaultSuccessHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    // 認(rèn)證成功處理器
    private AuthenticationSuccessHandler successHandler = this.defaultSuccessHandler;
     // 登錄認(rèn)證端點(diǎn)
    private LoginUrlAuthenticationEntryPoint authenticationEntryPoint;
    // 是否 自定義頁(yè)面 
    private boolean customLoginPage;
    // 登錄頁(yè)面
    private String loginPage;
    // 登錄成功url
    private String loginProcessingUrl;
    // 認(rèn)證失敗處理器
    private AuthenticationFailureHandler failureHandler;
    // 認(rèn)證路徑是否放開(kāi)
    private boolean permitAll;
    //  認(rèn)證失敗的url
    private String failureUrl;

    /**
     * Creates a new instance with minimal defaults
     */
    public CaptchaAuthenticationFilterConfigurer() {
        setLoginPage("/login/captcha");
        this.authFilter = new CaptchaAuthenticationFilter();
    }
    public CaptchaAuthenticationFilterConfigurer<H> formLoginDisabled() {
        this.formLoginEnabled = false;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaUserDetailsService(CaptchaUserDetailsService captchaUserDetailsService) {
        this.captchaUserDetailsService = captchaUserDetailsService;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaService(CaptchaService captchaService) {
        this.captchaService = captchaService;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> usernameParameter(String usernameParameter) {
        authFilter.setUsernameParameter(usernameParameter);
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaParameter(String captchaParameter) {
        authFilter.setCaptchaParameter(captchaParameter);
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> parametersConverter(Converter<HttpServletRequest, CaptchaAuthenticationToken> converter) {
        authFilter.setConverter(converter);
        return this;
    }
    @Override
    public void init(H http) throws Exception {
        updateAuthenticationDefaults();
        updateAccessDefaults(http);
        registerDefaultAuthenticationEntryPoint(http);
        // 這里禁用默認(rèn)頁(yè)面過(guò)濾器 如果你想自定義登錄頁(yè)面 可以自行實(shí)現(xiàn) 可能和FormLogin沖突
        // initDefaultLoginFilter(http);
        // 把對(duì)應(yīng)的Provider也在init時(shí)寫(xiě)入HttpSecurity
        initProvider(http);
    }
     @Override
    public void configure(H http) throws Exception {
        //這里改為使用前插過(guò)濾器方法
         http.addFilterBefore(filter, LogoutFilter.class);
    }
     // 其它方法 同AbstractAuthenticationFilterConfigurer
}  

其實(shí)就是模仿AbstractAuthenticationFilterConfigurer及其實(shí)現(xiàn)類(lèi)的風(fēng)格把用的配置項(xiàng)實(shí)現(xiàn)一邊。這里值得一提的是CaptchaService的配置也可以從Spring IoC中查找(參考getBeanOrNull方法,這個(gè)方法在Spring Security中隨處可見(jiàn),建議借鑒),這樣更加靈活,既能從方法配置也能自動(dòng)注入。

    private void initProvider(H http) {
        ApplicationContext applicationContext = http.getSharedObject(ApplicationContext.class);
        // 沒(méi)有配置CaptchaUserDetailsService就去Spring IoC獲取
        if (captchaUserDetailsService == null) {
            captchaUserDetailsService = getBeanOrNull(applicationContext, CaptchaUserDetailsService.class);
        }
        // 沒(méi)有配置CaptchaService就去Spring IoC獲取
        if (captchaService == null) {
            captchaService = getBeanOrNull(applicationContext, CaptchaService.class);
        } 
        // 初始化 Provider
        CaptchaAuthenticationProvider captchaAuthenticationProvider = this.postProcess(new CaptchaAuthenticationProvider(captchaUserDetailsService, captchaService));
        // 會(huì)增加到ProviderManager的注冊(cè)列表中
        http.authenticationProvider(captchaAuthenticationProvider);
    }

配置類(lèi)效果

我們來(lái)看看CaptchaAuthenticationFilterConfigurer的配置效果:

    @Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http, UserDetailsService userDetailsService) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .mvcMatchers("/foo/**").access("hasAuthority('ROLE_USER')")
                .anyRequest().authenticated()
                .and()
                // 所有的 AbstractHttpConfigurer 都可以通過(guò)apply方法加入HttpSecurity
                .apply(new CaptchaAuthenticationFilterConfigurer<>())
                // 配置驗(yàn)證碼處理服務(wù)   這里直接true 方便測(cè)試
                .captchaService((phone, rawCode) -> true)
                // 通過(guò)手機(jī)號(hào)去拿驗(yàn)證碼,這里為了方便直接寫(xiě)死了,實(shí)際phone和username做個(gè)映射  
                .captchaUserDetailsService(phone -> userDetailsService.loadUserByUsername("felord"))
                // 默認(rèn)認(rèn)證成功跳轉(zhuǎn)到/路徑  這里改造成把認(rèn)證信息直接返回json
                .successHandler((request, response, authentication) -> {
                // 這里把認(rèn)證信息以JSON形式返回
                    ServletServerHttpResponse servletServerHttpResponse = new ServletServerHttpResponse(response);
                    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
                           mappingJackson2HttpMessageConverter.write(authentication, MediaType.APPLICATION_JSON,servletServerHttpResponse);
                });
        return http.build();
    }

是不是要優(yōu)雅很多,解決了你自己配置過(guò)濾器的很多疑難雜癥。學(xué)習(xí)一定要模仿,先模仿成功,然后再分析思考為什么會(huì)模仿成功,最后形成自己的創(chuàng)造力。千萬(wàn)不要被一些陌生概念唬住,有些改造是不需要去深入了解細(xì)節(jié)的。

到此這篇關(guān)于Java中的Spring Security配置濾器的文章就介紹到這了,更多相關(guān)Spring Security過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • new出來(lái)的對(duì)象中無(wú)法使用@autowired進(jìn)行對(duì)象bean注入問(wèn)題

    new出來(lái)的對(duì)象中無(wú)法使用@autowired進(jìn)行對(duì)象bean注入問(wèn)題

    這篇文章主要介紹了基于new出來(lái)的對(duì)象中無(wú)法使用@autowired進(jìn)行對(duì)象bean注入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 使用Nexus搭建Maven私服的方法步驟

    使用Nexus搭建Maven私服的方法步驟

    這篇文章主要介紹了使用Nexus搭建Maven私服的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 詳解Maven安裝教程及是否安裝成功

    詳解Maven安裝教程及是否安裝成功

    這篇文章主要介紹了詳解Maven安裝教程及是否安裝成功,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • packages思維及使用Java添加Android平臺(tái)特定實(shí)現(xiàn)

    packages思維及使用Java添加Android平臺(tái)特定實(shí)現(xiàn)

    這篇文章主要為大家介紹了packages思維及使用Java添加Android平臺(tái)特定實(shí)現(xiàn)在Flutter框架里的體現(xiàn)和運(yùn)用詳解,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • idea多環(huán)境配置及問(wèn)題解決方案

    idea多環(huán)境配置及問(wèn)題解決方案

    這篇文章主要介紹了idea多環(huán)境配置及問(wèn)題解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 解決異常處理問(wèn)題:getReader()?has?already?been?called?for?this

    解決異常處理問(wèn)題:getReader()?has?already?been?called?for?this

    這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring?Boot集成JasperReport生成文檔的方法

    Spring?Boot集成JasperReport生成文檔的方法

    由于工作需要,要實(shí)現(xiàn)后端根據(jù)模板動(dòng)態(tài)填充數(shù)據(jù)生成PDF文檔,通過(guò)技術(shù)選型,使用Ireport5.6來(lái)設(shè)計(jì)模板,結(jié)合JasperReports5.6工具庫(kù)來(lái)調(diào)用渲染生成PDF文檔,這篇文章主要介紹了Spring?Boot集成JasperReport生成文檔,需要的朋友可以參考下
    2023-09-09
  • java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)

    java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • SpringBoot個(gè)性化配置的方法步驟

    SpringBoot個(gè)性化配置的方法步驟

    這篇文章主要介紹了SpringBoot個(gè)性化配置的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 詳解Spring-Boot集成Spring session并存入redis

    詳解Spring-Boot集成Spring session并存入redis

    這篇文章主要介紹了詳解Spring-Boot集成Spring session并存入redis,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評(píng)論

策勒县| 醴陵市| 衡水市| 高淳县| 若羌县| 云浮市| 礼泉县| 教育| 西乌| 高淳县| 三门峡市| 马公市| 莆田市| 黄陵县| 栾城县| 商南县| 白城市| 安平县| 日照市| 忻城县| 广西| 江阴市| 承德市| 南京市| 广南县| 太康县| 容城县| 弥渡县| 江孜县| 古浪县| 合阳县| 永福县| 广汉市| 西昌市| 武义县| 武功县| 浦城县| 宜川县| 兰西县| 大洼县| 南皮县|