SpringBoot中對(duì)SpringSecurity的配置

一、針對(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容