HttpSecurity初步理解
為什么會(huì)有 web security 這么個(gè)東西存在?
- 為了阻止假用戶冒充真實(shí)用戶訪問(wèn)網(wǎng)站,所以需要 認(rèn)證(authentication)。
- 為了阻止真實(shí)用戶訪問(wèn)本不是他應(yīng)該訪問(wèn)的頁(yè)面,所以需要授權(quán)(authorization)。
- 為了阻止真實(shí)用戶與網(wǎng)站之間傳輸?shù)男畔⒈坏谌礁`聽(tīng)到,所以需要加密(encryption)。
Spring Security是一個(gè)強(qiáng)大的、可根據(jù)需求高度自定義的用戶認(rèn)證和訪問(wèn)控制框架。Spring Security 怎么保證所有向 Spring application 發(fā)送請(qǐng)求的用戶必須先通過(guò)認(rèn)證?怎么保證用戶可以通過(guò)表單或者 http 的方式進(jìn)行認(rèn)證。解決的辦法是Spring Security中有個(gè)WebSecurityConfigurerAdapter類,程序員通過(guò)繼承這個(gè)類并重寫(xiě) configure(HttpSecurity http) 方法就可以按照?qǐng)鼍靶枨笞远x認(rèn)證和授權(quán)。
// 這是源碼中默認(rèn)的 認(rèn)證 和 授權(quán) 的配置。protected void configure(HttpSecurity http) throws Exception {this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated().and()).formLogin().and()).httpBasic();}這個(gè)配置規(guī)定了以下三點(diǎn):
- 若要給應(yīng)用程序發(fā)送請(qǐng)求,則發(fā)送請(qǐng)求的用戶必須先通過(guò)認(rèn)證。
- 允許用戶采用表單登錄的方式進(jìn)行認(rèn)證。
- 允許用戶采用 HTTP 基本的認(rèn)證方式進(jìn)行認(rèn)證。
Java配置和表單登錄
當(dāng)配置表單登錄后,就需要一個(gè)登錄頁(yè)面供用戶填寫(xiě) 用戶名 和 密碼。Spring Secrity 默認(rèn)了一個(gè)頁(yè)面,如果你覺(jué)得它很丑,也可以自己寫(xiě)一個(gè),使用 loginPage("/login") 聲明自定義的登錄頁(yè)面所在位置。當(dāng)用戶第一次訪問(wèn) web 應(yīng)用時(shí)會(huì)自動(dòng)跳轉(zhuǎn)到默認(rèn)登錄界面或者用戶自定義的登錄界面。
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login") .permitAll(); }在這個(gè)demo中,loginPage("/login")指定了登錄頁(yè)的URL,并允許所有的用戶(包括沒(méi)認(rèn)證的)訪問(wèn)登錄頁(yè),formLogin().permitAll()方法允許所有用戶訪問(wèn)這個(gè)URL。
認(rèn)證請(qǐng)求
應(yīng)用程序的每個(gè)URL都要求用戶通過(guò)認(rèn)證,我們可以通過(guò)給http.authorizeRequests()方法添加子方法的方式為每個(gè)URL指定自定義要求。例如:
//請(qǐng)求授權(quán)驗(yàn)證 protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests() 1.antMatchers("/resources/**", "/signup", "/about").permitAll() 2.antMatchers("/admin/**").hasRole("ADMIN") 3.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 4.anyRequest().authenticated() 5.and()// ....formLogin(); }-
**http.authorizeRequests()**下添加了多個(gè)匹配器,每個(gè)匹配器用來(lái)控制不同的URL接受不同的用戶訪問(wèn)。簡(jiǎn)單講,http.authorizeRequests()就是在進(jìn)行請(qǐng)求的權(quán)限配置。
-
所有用戶都可以訪問(wèn)以/resources/**開(kāi)頭的URL,和/signup、/about兩個(gè)URL。
-
擁有ADMIN角色的用戶可以訪問(wèn)以/admin/開(kāi)頭的URL。hasRole(String):如果當(dāng)前用戶有String表示的角色,則返回True。
同時(shí)擁有ADMIN和DBA角色的用戶可以訪問(wèn)以/db/**開(kāi)頭的URL。 -
access(String):當(dāng)String為true時(shí)才可進(jìn)行訪問(wèn)。
所有沒(méi)被匹配器匹配到的URL都需用戶通過(guò)認(rèn)證。 -
and()返回一個(gè)SecurityBuilder。Spring Security支持兩種認(rèn)證方式:formLogin()和httpBasic()。
官方文檔:https://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/#samples
總結(jié)
以上是生活随笔為你收集整理的HttpSecurity初步理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java方面总结
- 下一篇: NoClassDefFoundError