一、針對(duì)請(qǐng)求HTTP進(jìn)行配置
因?yàn)榇蠹叶贾繱pring Security是對(duì)用戶進(jìn)行驗(yàn)證,那么程序是如何知道我們需要對(duì)所有的用戶進(jìn)行驗(yàn)證呢,這就需要我們針對(duì)http對(duì)于所有的請(qǐng)求都進(jìn)行認(rèn)證配置,其中,WebSecurityConfigurerAdapter抽象類已經(jīng)提供了默認(rèn)的配置,我們只需要擴(kuò)展里面的配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//對(duì)于任何請(qǐng)求都需要進(jìn)行認(rèn)證
.authorizeRequests()
.anyRequest().authenticated()
//允許我們配置父級(jí)的方法來(lái)關(guān)閉XML中等效的java配置
.and()
//添加http請(qǐng)求的過(guò)濾器,對(duì)于要經(jīng)過(guò)認(rèn)證的url,需要經(jīng)過(guò)過(guò)濾器去處理
.addFilter(new AuthBasicAuthenticationFilter(authenticationManagerBean()));
//關(guān)閉csrf,防止csrf攻擊
http.csrf().disable();
}
二、授權(quán)請(qǐng)求
這里有兩種,主要用于區(qū)分針對(duì)前端和其他的后臺(tái)接口請(qǐng)求
對(duì)于前端,我們需要繞過(guò)后臺(tái)的過(guò)濾器,所以適合用WebSecurity的方法
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/js/**", "/css/**", "/images/**", "/fonts/**", "favicon.ico");
//可以看到,以api為開頭的接口也在里面,這表示W(wǎng)ebSecurity可以過(guò)濾前后端的資源,只是更好的是比較適合前端過(guò)濾
web.ignoring().antMatchers("/login", "/error", "/api/open/**", "/api/user/login", "/api/user/logout" ,
"/session/invalid");
//可以仿照上面一句忽略靜態(tài)資源
}
另一種方法還是用HttpSecurity提供的antMatcher()方法,即
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**", "/signup", "/about").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().authenticated() []
.and()
.formLogin();
}
注意:WebSecurity與HttpSecurity的區(qū)別:
顧名思義,WebSecurity主要是配置跟web資源相關(guān)的,比如css、js、images等等,但是這個(gè)還不是本質(zhì)的區(qū)別,關(guān)鍵的區(qū)別如下:
ingore是完全繞過(guò)了spring security的所有filter,相當(dāng)于不走spring security
permitall沒(méi)有繞過(guò)spring security,其中包含了登錄的以及匿名的。
用戶身份的認(rèn)證包括下面幾個(gè)常見(jiàn)的步驟:
1、提示用戶輸入用戶名與密碼;
2、系統(tǒng)驗(yàn)證用戶名密碼的正確性;
3、獲取該用戶名的上下文信息(即用戶在該系統(tǒng)中可用的信息,包括角色、權(quán)限);
4、為用戶建立安全上下文;
5、繼續(xù)執(zhí)行其他的操作,譬如對(duì)比登陸權(quán)限等;
上面的前3項(xiàng)構(gòu)成了系統(tǒng)的身份驗(yàn)證構(gòu)成,他們?cè)赟pring Security中是如何創(chuàng)建對(duì)象并進(jìn)行相關(guān)的操作的呢?
1、用戶輸入用戶名密碼,會(huì)將其組裝成一個(gè)實(shí)例,即UsernamePasswordAuthenticationToken
2、將UsernamePasswordAuthenticationToken傳遞給AuthenticationManaager對(duì)象中進(jìn)行驗(yàn)證,在這個(gè)過(guò)程中,會(huì)調(diào)用我們自己封裝的UserDetailsService對(duì)象去獲取該輸入用戶的具體的信息,包括該用戶的角色、權(quán)限,并將返回封裝了用戶信息的對(duì)象Authentication對(duì)象中;
3、然后再通過(guò)適配器SecurityContextHolder.getContext().setAuthentication(authentication)將返回的身份驗(yàn)證對(duì)象保存在上下文中
參考鏈接:https://segmentfault.com/a/1190000012160850