老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

常見(jiàn)的SpringSecurity問(wèn)題有哪些

本篇內(nèi)容介紹了“常見(jiàn)的SpringSecurity問(wèn)題有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、移動(dòng)服務(wù)器托管、云服務(wù)器、虛擬空間、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專(zhuān)業(yè)提供云主機(jī)、虛擬空間、國(guó)際域名空間、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

登錄和登錄處理問(wèn)題

我們已經(jīng)知道SpringSecurity的DefaultLoginPageGeneratingFilter會(huì)我們默認(rèn)生成登錄頁(yè),這個(gè)路徑是login。

但是我們處理登錄的路徑是啥呢?

常見(jiàn)的SpringSecurity問(wèn)題有哪些

我們可以看到登錄頁(yè)面也是login。

這就其了怪了,為什么同樣的路徑產(chǎn)生了不同的效果?

因?yàn)椋篐TTP method的不同,登錄頁(yè)面是GET請(qǐng)求,登錄操作是POST請(qǐng)求。

操作就是這么騷,讓無(wú)數(shù)人閃了腰。

所以,當(dāng)你做前后端分離項(xiàng)目,前端使用get('/login',optioin)發(fā)現(xiàn)是404,不要奇怪,不要流淚,改成post也許就好了。

這么騷的操作是如何實(shí)現(xiàn)的呢?

答案在UsernamePasswordAuthenticationFilter:

常見(jiàn)的SpringSecurity問(wèn)題有哪些

我們可以看到,UsernamePasswordAuthenticationFilter只匹配post的login,也可以看到為什么通過(guò)UsernamePasswordAuthenticationFilter認(rèn)證參數(shù)必須是username和password了。

其實(shí),操作都是在它的父類(lèi)AbstractAuthenticationProcessingFilter中完成,既然是Filter肯定看doFilter方法,調(diào)用了requiresAuthentication。

2次login:

首先是(login,get)UsernamePasswordAuthenticationFilter沒(méi)有處理直接跳過(guò)了,如果是需要授權(quán)的url,后面到了ExceptionTranslationFilter,因?yàn)樾枰J(rèn)證和授權(quán),于是被重定向到了登錄頁(yè)面。

然后是(login,post)匹配上了,通過(guò)UsernamePasswordAuthenticationFilter完成了認(rèn)證操作。

當(dāng)然上面參數(shù)都是可以配置的,例如,登錄頁(yè)面url、處理登錄的url、用戶(hù)名參數(shù)、密碼參數(shù)、沒(méi)有認(rèn)證咋處理,認(rèn)證成功咋處理:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
            .loginPage("/login")//登錄頁(yè)面
            .loginProcessingUrl("/do-login")//處理登錄邏輯
            .passwordParameter("username")//用戶(hù)名參數(shù)
            .passwordParameter("password")//密碼參數(shù)
            // 三個(gè)配置一個(gè)就可以了
            .defaultSuccessUrl("/loginsucess").successForwardUrl("/sucess").successHandler(sucessHandler)
            // 三個(gè)配置一個(gè)就可以了
            .failureForwardUrl("/fail").failureUrl("/failure").failureHandler(loginAuthenticationFailureHandler)
            .permitAll();
}

defaultSuccessUrl和successForwardUrl,最好使用defaultSuccessUrl,可以重定向到來(lái)登錄頁(yè)面之前的url,defaultSuccessUrl還接收一個(gè)boolean參數(shù),如果設(shè)置為true,就和successForwardUrl等價(jià)。

如果,想要了解login和UsernamePasswordAuthenticationFilter到底是怎樣聯(lián)系起來(lái)的,還得看http.formLogin():

public FormLoginConfigurer formLogin() throws Exception {
    return getOrApply(new FormLoginConfigurer<>());
}

FormLoginConfigurer看名字我們就知道是一個(gè)Configurer配置類(lèi),這個(gè)類(lèi)前面的文章已經(jīng)介紹了,可以看一下,也可以簡(jiǎn)單看一下后面的重要SecurityBuilder提示:

常見(jiàn)的SpringSecurity問(wèn)題有哪些

有興趣可以自己看一下這個(gè)類(lèi),這里就不詳細(xì)展開(kāi)了。

重定向無(wú)限循環(huán)問(wèn)題

常見(jiàn)的SpringSecurity問(wèn)題有哪些

如果出現(xiàn)如上圖所示的無(wú)限循環(huán)問(wèn)題,那么多半有類(lèi)似下面的配置:

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers(
            "/login"
     );
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/index.html").permitAll().anyRequest().authenticated();
    http.formLogin();
}

了解了前面的登錄流程,理解這個(gè)無(wú)限循環(huán)就容易多了,就是因?yàn)閘ogin不需要被認(rèn)證,但是login需要被授權(quán),于是ExceptionTranslationFilter到被定向到默認(rèn)的登錄頁(yè)面login,然后進(jìn)入無(wú)限套娃模式。

關(guān)于授權(quán)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/index.html").permitAll().anyRequest().authenticated();
    http.formLogin();
}

關(guān)于授權(quán)主要看http.authorizeRequests()方法:

public ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry authorizeRequests()
        throws Exception {
    ApplicationContext context = getContext();
    return getOrApply(new ExpressionUrlAuthorizationConfigurer<>(context)).getRegistry();
}

跨越問(wèn)題

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

	private CorsConfiguration buildConfig() {
		CorsConfiguration corsConfiguration = new CorsConfiguration();
		corsConfiguration.addAllowedOrigin("*");
		corsConfiguration.addAllowedHeader("*");
		corsConfiguration.addAllowedMethod("*");
		corsConfiguration.addExposedHeader("Authorization");
		return corsConfiguration;
	}

	@Bean
	public CorsFilter corsFilter() {
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", buildConfig());
		return new CorsFilter(source);
	}

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**")
				.allowedOrigins("*")
//          .allowCredentials(true)
				.allowedMethods("GET", "POST", "DELETE", "PUT")
				.maxAge(3600);
	}
}

除了上面的配置,還需要:

protected void configure(HttpSecurity http) throws Exception {
		http.cors();
}

自己測(cè)試很多時(shí)候會(huì)把csrf禁用,否則,使用post,但是參數(shù)在url中這種請(qǐng)求就會(huì)被攔截。

protected void configure(HttpSecurity http) throws Exception {
		http.cors().and().csrf().disable();
}

重要SecurityBuilder提示

WebSecurity

WebSecurity是一個(gè)SecurityBuilder,所以它的主要職責(zé)之一就是創(chuàng)建Filter,重點(diǎn)關(guān)注它的build方法,是繼承了AbstractSecurityBuilder的build,具體邏輯在AbstractConfiguredSecurityBuilder的doBuild方法中。

@Override
protected final O doBuild() throws Exception {
    synchronized (this.configurers) {
        this.buildState = BuildState.INITIALIZING;
        beforeInit();
        init();
        this.buildState = BuildState.CONFIGURING;
        beforeConfigure();
        configure();
        this.buildState = BuildState.BUILDING;
        O result = performBuild();
        this.buildState = BuildState.BUILT;
        return result;
    }
}

很標(biāo)準(zhǔn)的模板方法模式。

正真執(zhí)行構(gòu)建的邏輯在performBuild方法中,這個(gè)方法在WebSecurity創(chuàng)建了FilterChainProxy,在HttpSecurity中創(chuàng)建了DefaultSecurityFilterChain。

HttpSecurity

前面已經(jīng)分析了,HttpSecurity的目的就一個(gè)創(chuàng)建DefaultSecurityFilterChain,注意它的performBuild方法。

“常見(jiàn)的SpringSecurity問(wèn)題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


本文名稱(chēng):常見(jiàn)的SpringSecurity問(wèn)題有哪些
本文來(lái)源:http://www.xueling.net.cn/article/poojgs.html

其他資訊

在線咨詢(xún)
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 免费观看又色又爽又黄的韩国 | 色哺乳xxxxhd国产 | 亚欧洲精品视频免费观看mv在线观看 | 在线永久免费观看日韩a | 国产午夜精品一区二区三区小说 | 天天综合网久久综合网 | 欧美性猛交xxxx乱大交喷浆 | 久久精品无码一区二区小草 | 久章草在线无码视频观看 | 中文字幕粉嫩av | 欧美性猛交久久久乱大交小说 | 国产av明星换脸精品网站 | 美女特级毛片 | 亚洲av日韩av无码大全 | 久久久久se | 国产一精品一AV一免费 | 亚洲m码欧洲s码sss222 | 美女毛多水多做爰国产毛片小说 | 精品国产第一国产综合精品 | 末发育娇小性色xxxx | 亚洲国产成人va在线观看天堂 | 精品国产乱码久久久久久老虎 | 美女扒了内裤让男人桶 | 久操av在线播放 | 夫妻午夜视频 | 中国农村真实BBWBBWBBW | 成人免费观看毛片 | 蜜桃精品成人影片 | 综合在线亚洲 | 剧情演绎国产在线视频 | 中文字幕大看蕉永久网 | 91茄子视频在线观看 | 亚洲视频在线a | 久久久国产乱子伦精品作者 | 真人做爰欧美aaaaa | 农村少妇无套内谢粗又长 | 91视频青娱乐 | 国产免费一区二区三区最新6 | 免费国产一级淫片 | 久久久青| www.一区二区.com |