HttpSecurity初步理解
為什么會有 web security 這么個東西存在?
- 為了阻止假用戶冒充真實用戶訪問網站,所以需要 認證(authentication)。
- 為了阻止真實用戶訪問本不是他應該訪問的頁面,所以需要授權(authorization)。
- 為了阻止真實用戶與網站之間傳輸的信息被第三方竊聽到,所以需要加密(encryption)。
Spring Security是一個強大的、可根據需求高度自定義的用戶認證和訪問控制框架。Spring Security 怎么保證所有向 Spring application 發送請求的用戶必須先通過認證?怎么保證用戶可以通過表單或者 http 的方式進行認證。解決的辦法是Spring Security中有個WebSecurityConfigurerAdapter類,程序員通過繼承這個類并重寫 configure(HttpSecurity http) 方法就可以按照場景需求自定義認證和授權。
// 這是源碼中默認的 認證 和 授權 的配置。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();}這個配置規定了以下三點:
- 若要給應用程序發送請求,則發送請求的用戶必須先通過認證。
- 允許用戶采用表單登錄的方式進行認證。
- 允許用戶采用 HTTP 基本的認證方式進行認證。
Java配置和表單登錄
當配置表單登錄后,就需要一個登錄頁面供用戶填寫 用戶名 和 密碼。Spring Secrity 默認了一個頁面,如果你覺得它很丑,也可以自己寫一個,使用 loginPage("/login") 聲明自定義的登錄頁面所在位置。當用戶第一次訪問 web 應用時會自動跳轉到默認登錄界面或者用戶自定義的登錄界面。
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login") .permitAll(); }在這個demo中,loginPage("/login")指定了登錄頁的URL,并允許所有的用戶(包括沒認證的)訪問登錄頁,formLogin().permitAll()方法允許所有用戶訪問這個URL。
認證請求
應用程序的每個URL都要求用戶通過認證,我們可以通過給http.authorizeRequests()方法添加子方法的方式為每個URL指定自定義要求。例如:
//請求授權驗證 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()**下添加了多個匹配器,每個匹配器用來控制不同的URL接受不同的用戶訪問。簡單講,http.authorizeRequests()就是在進行請求的權限配置。
-
所有用戶都可以訪問以/resources/**開頭的URL,和/signup、/about兩個URL。
-
擁有ADMIN角色的用戶可以訪問以/admin/開頭的URL。hasRole(String):如果當前用戶有String表示的角色,則返回True。
同時擁有ADMIN和DBA角色的用戶可以訪問以/db/**開頭的URL。 -
access(String):當String為true時才可進行訪問。
所有沒被匹配器匹配到的URL都需用戶通過認證。 -
and()返回一個SecurityBuilder。Spring Security支持兩種認證方式:formLogin()和httpBasic()。
官方文檔:https://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/#samples
總結
以上是生活随笔為你收集整理的HttpSecurity初步理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java方面总结
- 下一篇: NoClassDefFoundError