Spring Boot整合 Spring Security

?Spring Boot整合

1、RBAC?權限模型

RBAC模型(Role-Based Access Control:基于角色的訪問控制)

在RBAC模型里面,有3個基礎組成部分,分別是:用戶、角色和權限,它們之間的關系如下圖所示

SELECT * FROM sec_permission;
SELECT * FROM sec_role_permission ;
SELECT * FROM sec_role;
SELECT * FROM sec_user_role;
SELECT * FROM sec_user;

2、啟動器依賴引入

啥配置也沒做,啥類也沒寫。只是增加了一個啟動器依賴

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

重新訪問首頁:http://localhost:8080/


3、用戶名密碼

默認:

用戶名默認:user

密碼在服務啟動時打印在了控制臺

自定義:

?當然我們也可以通過application.yml指定配置用戶名密碼

  • security.user.name 指定默認的用戶名,默認為user.

  • security.user.password 默認的用戶密碼.

spring:security:user:name: adminpassword: admin

關閉security驗證:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().permitAll().and().logout().permitAll();//配置不需要登錄驗證}
}

WebSecurityConfigurerAdapter?是由Spring Security提供的Web應用安全配置的適配器

WebSecurityConfigurerAdapter?是一個適配器類,允許開發者通過重寫特定的方法來自定義其 Web 安全配置

創建一個配置類WebSecurityConfig繼承WebSecurityConfigurerAdapter這個抽象類并重寫configure(HttpSecurity http)方法,可以精確地定義哪些URL可以由哪些角色訪問。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() // 表單方式.and().authorizeRequests() // 授權配置.anyRequest().authenticated(); //所有未匹配的請求都需要用戶進行身份驗證}
}

Spring Security提供了這種鏈式的方法調用。上面配置指定了認證方式為表單登錄,并且所有請求都需要進行認證。

HttpSecurity?是 Spring Security 中用于構建安全配置的一個類。通過該類,開發者可以配置許多與 HTTP 安全相關的選項,如認證、授權、CORS、CSRF 保護等

.formLogin()?是?HttpSecurity?類的一個方法,用于啟用基于表單的身份驗證。當你調用這個方法時,Spring Security 會自動配置登錄表單的相關設置,如登錄頁面的 URL、登錄成功和失敗的處理等。你可以進一步定制這些設置,以適應你的應用程序需求。

-------------------------------

http.authorizeRequests()?是?HttpSecurity?類的一個方法,用于定義 URL 的訪問權限。通過該方法,你可以指定哪些 URL 需要特定的角色或權限才能訪問,哪些 URL 可以公開訪問等。

--------------

.anyRequest().authenticated()?表示所有未匹配的請求都需要用戶進行身份驗證。


4、基于數據庫的登錄認證

Spring Security支持通過實現UserDetailsService接口的方式來提供用戶認證授權信息。主要功能:根據用戶名查詢用戶信息

@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserDao userDao;@Autowiredprivate RoleDao roleDao;@Autowiredprivate PermissionDao permissionDao;@Resourceprivate PasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//通過用戶名從數據庫獲取用戶信息User user = userDao.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("未找到用戶信息 : " + username));//定義權限列表List<GrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("a"));authorities.add(new SimpleGrantedAuthority("b"));authorities.add(new SimpleGrantedAuthority("c"));//返回spring security的User對象//user.getPassword() 數據庫中的密碼已經是密文存儲return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);}
}

返回值類型是UserDetails,我們可以直接使用Spring Security提供的UserDetails接口實現類org.springframework.security.core.userdetails.User


5、授權GrantedAuthority

GrantedAuthority則表示用戶驗證通過后被授予的權限。

SimpleGrantedAuthority

SimpleGrantedAuthority是默認的授權實現,它只存儲權限(存儲授予Authentication對象的權限的String表示形式),是一種簡易的授權實現。

  • GrantedAuthority:直譯"授予權限"
  • Authentication:直譯"驗證"

給我的感覺就是權限就是一個字符串,難道什么樣的字符串都行嗎?為啥定義的這么模糊

那我們就姑且給他"a","b","c"。。看看它怎么說

AuthorityUtils:此類一般用于UserDetailsService的實現類中的loadUserByUsername方法

作用為給user賬戶添加一個或多個權限,用逗號分隔,底層調用的是createAuthorityList方法,唯一區別在于此方法把所有的權限包含進一個字符串參數中,只不過用逗號分隔。

@Service
public class UserDetailsServiceImpl implements UserDetailsService{@AutowiredPasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//比較密碼String pass=passwordEncoder.encode("123");//加密return new User(username,pass,AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal"));}}

createAuthorityList

將權限轉換為List,如

@Service
public class UserDetailsServiceImpl implements UserDetailsService{@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {List<GrantedAuthority> list=AuthorityUtils.createAuthorityList("admin","normal");//一個權限一個參數return new User(username,pass,list);}
}

1


6、配置類中配置

實際項目中我們不會把密碼明文存儲在數據庫中。只需要使用把BCryptPasswordEncoder對象注入Spring容器中,SpringSecurity就會使用該PasswordEncoder來進行密碼校驗

Spring Security實現的BCryptPasswordEncoder已經足夠強大,它對相同的密碼進行加密后可以生成不同的結果

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Resourceprivate UserDetailsService userDetailsService;@Beanpublic PasswordEncoder passwordEncoder() {//使用默認的BCryptPasswordEncoder加密方案return new BCryptPasswordEncoder();}/*** 配置用戶詳細信息的服務和密碼編碼器** @param auth* @throws Exception*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//數據庫讀取的用戶進行身份認證auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() // 表單方式.and().authorizeRequests() // 授權配置.anyRequest().authenticated(); //所有未匹配的請求都需要用戶進行身份驗證}
}

Spring Security中的BCryptPasswordEncoder方法采用SHA-256 +隨機鹽+密鑰對密碼進行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味著可以解密(這個與編碼/解碼一樣),但是采用Hash處理,其過程是不可逆的。

1)加密(encode):注冊用戶時,使用SHA-256+隨機鹽+密鑰把用戶輸入的密碼進行hash處理,得到密碼的hash值,然后將其存入數據庫中。

2)密碼匹配(matches):用戶登錄時,密碼匹配階段并沒有進行密碼解密(因為密碼經過Hash處理,是不可逆的),而是使用相同的算法把用戶輸入的密碼進行hash處理,得到密碼的hash值,然后將其與從數據庫中查詢到的密碼hash值進行比較。如果兩者相同,說明用戶輸入的密碼正確。

再次訪問接口:http://127.0.0.1:8089/hello

使用賬號密碼登錄 admin/123456


7、權限控制

Spring Security支持方法級別的權限控制。在此機制上,我們可以在任意層的任意方法上加入權限注解,加入注解的方法將自動被Spring Security保護起來,僅僅允許特定的用戶訪問,從而還到權限控制的目的

@PreAuthorize() 該注解用于方法前驗證權限

//使用權限注解標明只有擁有“admin”權限的人才能訪問:???????@PreAuthorize("hasAuthority('admin')")
@RestController
public class HelloController {@RequestMapping("/hello")public String sayHello() {return "hello";}@RequestMapping("/a")@PreAuthorize("hasAuthority('a')")public String sayA() {return "aaaaa";}@RequestMapping("/d")@PreAuthorize("hasAuthority('d')")public String sayB() {return "ddddd";}
}

Spring Security默認是禁用注解的,要想開啟注解,要在繼承WebSecurityConfigurerAdapter的類加@EnableGlobalMethodSecurity()注解,并在該類中將AuthenticationManager定義為Bean。說實話我沒有注入AuthenticationManager這個bean的時候,也做到了權限校驗。。這到底有啥用?

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Resourceprivate UserDetailsService userDetailsService;@Beanpublic PasswordEncoder passwordEncoder() {//使用默認的BCryptPasswordEncoder加密方案return new BCryptPasswordEncoder();}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}/*** 配置用戶詳細信息的服務和密碼編碼器** @param auth* @throws Exception*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//數據庫讀取的用戶進行身份認證auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() // 表單方式.and().authorizeRequests() // 授權配置.anyRequest().authenticated(); //所有未匹配的請求都需要用戶進行身份驗證}
}

我們看到@EnableGlobalMethodSecurity?分別有prePostEnabled 、securedEnabled、jsr250Enabled三個字段,其中每個字段代碼一種注解支持,默認為false,true為開啟

重新登錄訪問。記得之前我隨便給的權限字符串a,b,c。。。訪問a是沒問題的

訪問d會返回403錯誤碼。

自定義權限不足處理器來處理權限不足時候的操作


8、Session管理

用戶登錄成功后,信息保存在服務器Session中。如Tomcat

登錄后,可以看到cookie中存儲了JSESSIONID的cookie。

Session超時設置

如可以設置session有效期為1小時

server:session:timeout: 3600

這時候,就涉及到一個session共享

當應用集群部署的時候,用戶在A應用上登錄認證了,后續通過負載均衡可能會把請求發送到B應用,而B應用服務器上并沒有與該請求匹配的認證Session信息,所以用戶就需要重新進行認證

Spring Security默認的退出登錄URL為/logout


Spring Security OAuth2

1、什么是OAuth

OAuth是一種用來規范令牌(Token)發放的授權機制,主要包含了四種授權模式:授權碼模式、簡化模式、密碼模式和客戶端模式

OAuth相關的名詞

  1. Third-party application?第三方應用程序,比如這里的虎牙直播;

  2. HTTP service?HTTP服務提供商,比如這里的QQ(騰訊);

  3. Resource Owner?資源所有者,就是QQ的所有人,你;

  4. User Agent?用戶代理,這里指瀏覽器;

  5. Authorization server?認證服務器,這里指QQ提供的第三方登錄服務;

  6. Resource server?資源服務器,這里指虎牙直播提供的服務,比如高清直播,彈幕發送等(需要認證后才能使用)。

Spring Security OAuth2主要包含認證服務器和資源服務器這兩大塊的實現:

認證服務器主要包含了四種授權模式的實現和Token的生成與存儲

資源服務器主要是在Spring Security的過濾器鏈上加了OAuth2AuthenticationProcessingFilter過濾器,即使用OAuth2協議發放令牌認證的方式來保護我們的資源


2、認證授權服務器

創建認證服務器很簡單,只需要在Spring Security的配置類上使用@EnableAuthorizationServer注解標注即可

使用?@EnableAuthorizationServer?注解,在應用中自動開啟和配置 Spring Security OAuth 的授權服務組件。

?@EnableAuthorizationServer?注解主要是導入兩個配置類,分別是:

  • AuthorizationServerEndpointsConfiguration,這個配置類主要配置授權端點,獲取token的端點。大家就把對應的端點想象成controller即可,在這個controller下開放了若干個@RequestMapping,比如常見的有:/oauth/authorize(授權路徑)/oauth/token(獲取token)
  • AuthorizationServerSecurityConfiguration,主要是做spring-security的安全配置

3、資源服務器

資源服務器的配置也很簡單,只需要在配置類上使用@EnableResourceServer注解標注即可:

通過資源服務器來保護我們指定的資源,必須在獲取授權認證的時候才能訪問。在SpringBoot當中,我們可以通過@EnableResourceServer注解來開啟此功能。

    @Configuration@EnableResourceServerpublic class ResourceConfigure extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).and().authorizeRequests().antMatchers("/free/**").permitAll().and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();//必須認證過后才可以訪問}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215932.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

02.類模板

2、類模板 2.1 類模板語法 建立一個通用類&#xff0c;類中的成員、數據類型可以不具體制定&#xff0c;用一個虛擬的類型來代表。 template<typename T> // 類template&#xff1a;聲明創建模板typename&#xff1a;表名其后面的符號是一種數據類型&#xff0c;可以用 …

【算法】算法題-20231211

這里寫目錄標題 一、387. 字符串中的第一個唯一字符二、1189. “氣球” 的最大數量三、1221. 分割平衡字符串 一、387. 字符串中的第一個唯一字符 簡單 給定一個字符串 s &#xff0c;找到 它的第一個不重復的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;則返回…

算法通關村第十五關 | 青銅 | 用4KB內存尋找重復元素

處理海量數據的思路 1.使用位存儲&#xff1a;占用的空間是存整數的 1/8 。 2.分塊&#xff1a;也叫外部排序&#xff0c;將大文件劃分為若干小塊&#xff0c;先處理小塊再逐步得到想要的結果&#xff0c;需要至少遍歷兩次全部序列&#xff0c;是用時間換空間的方法。 3.堆&…

Mockjs 增、刪、改、查(分頁、多條件查詢)

查&#xff08;分頁、多條件查詢&#xff09;&#xff1a; 關鍵代碼&#xff1a; Mock.mock(/vue-table-list/tableLinkage/list, post, (option) > {// console.log("&#x1f680; ~ file: tableLinkage.js:66 ~ Mock.mock ~ option:", option)const params J…

MFC畫折線圖,基于x64系統

由于項目的需要&#xff0c;需要畫一個折線圖。 傳統的Teechart、MSChart、HighSpeedChart一般是只能配置在x86系統下&#xff0c;等到使用x64系統下運行就是會報出不知名的錯誤&#xff0c;這個地方讓人很苦惱。 我在進行配置的過程之中&#xff0c;使用Teechart將x86配置好…

基于Java SSM框架實現班級同學錄、聚會報名網站系統項目【項目源碼+論文說明】

基于java的SSM框架實現班級同學錄聚會報名網站系統演示 摘要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人…

程序員考公筆記之邏輯判斷(圖形推理)

文章目錄 寫在前面1、邏輯判斷1.1、圖形推理1.1.1、位置類1.1.2、樣式類1.1.3、數量類1.1.4、屬性類1.1.5、六面體 寫在前面 1、邏輯判斷 1.1、圖形推理 觀察&#xff1a;先宏觀&#xff0c;再微觀 圖形推理的命題形式&#xff1a; 一組式 觀察路徑&#xff1a;順序看(考最…

解決方案- 材料吸波、屏蔽性能測試系統 (10MHz~500GHz)

材料吸波、屏蔽性能測試系統 &#xff08;10MHz~500GHz&#xff09; 材料電磁參數綜合測試解決方案 材料吸波、屏蔽性能測試系統測試頻率范圍可達10MHz&#xff5e;500GHz&#xff0c;可實現材料反射率、屏蔽性能特性參數測試。系統由矢量網絡分析儀、測試夾具、系統軟件等組…

申論筆記(思路技巧)

文章目錄&#xff1a; 一&#xff1a;福利 二&#xff1a;常見題型 1.歸納概括題 2.提出對策/措施/建議題 2.1 找到對策的來源 2.2 提煉對策 2.3 明確是否需要先概括問題 2.4 對策表述三部曲 3.綜合分析題 3.1 綜合分析最大的難點 3.2 分析問題的技巧 4.應用文/公文…

力扣每日一題day34[110. 平衡二叉樹]

給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a; 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;t…

wappalyzer基于插件的網站開發技術解析工具

一、wappalyzer 解釋&#xff1a;這是一款強大的工具&#xff0c;其主要能提供一種快速、可靠地檢測網站所使用技術棧的方法&#xff0c;也就說說&#xff0c;服務器發來的信息都會被它剖析&#xff0c;然后分析出前端的技術棧&#xff0c;有時后端所使用的技術棧如果網頁特征…

[ 藍橋杯Web真題 ]-冬奧大抽獎

目錄 介紹 準備 目標 規定 思路 知識補充 解法參考 介紹 藍橋云課慶冬奧需要舉行一次抽獎活動&#xff0c;我們一起做一個頁面提供給云課冬奧抽獎活動使用。 準備 開始答題前&#xff0c;需要先打開本題的項目代碼文件夾&#xff0c;目錄結構如下&#xff1a; ├──…

甲醛處理企業網站效果如何

甲醛往往是新裝房間主所擔心的問題&#xff0c;而甲醛處理公司則可以處理甲醛問題&#xff0c;市場需求也比較高&#xff0c;雖然具備同城服務屬性&#xff0c;但外地或連鎖經營也非常適合&#xff0c;而品牌們也遇到一些痛點&#xff1a; 1、品牌宣傳拓客難 甲醛處理公司也需…

公司app定制開發 ,打造專屬企業移動應用

公司app定制&#xff1a;打造專屬企業移動應用 在當今數字化時代&#xff0c;移動應用已經成為了人們生活中不可或缺的一部分&#xff0c;越來越多的企業也意識到了移動應用對于企業形象和業務拓展的重要性&#xff0c;為了滿足企業的需求&#xff0c;公司app定制服務應運而生…

基于查表法的水流量算法設計與實現

寫在前面 本文分享的是一種基于查表法的水流量的算法方案設計與實現&#xff0c;算法簡單易懂&#xff0c;主要面向初學者&#xff0c;有兩個目的&#xff1a;一是給初學者一些算法設計的思路引導&#xff1b;二是引導初學者學習怎樣用C語言編程實現。 一、設計需求 基于“19…

C++ 中的引用

文章目錄 C 引用的應用1. 修改函數中傳遞的參數2. 避免復制大型結構3. for 循環中修改所有對象4. for 循環中避免復制對象 References vs Pointers引用的限制使用引用的優點練習Quesition 1Question 2Question 3Question 4Question 5Question 6 如果一個變量被聲明為引用&#…

Android-Framework 默認橫屏、dpi設置

一、環境 高通865 Android 10 二、源碼修改位置 1、修改dpi device/qcom/kona/kona.mk -116,7 116,7 TARGET_USES_RRO : true# system prop for Bluetooth SOC typePRODUCT_PROPERTY_OVERRIDES \vendor.qcom.bluetooth.sochastings \ - ro.sf.lcd_density480ro.sf.lcd_d…

Python中的logging介紹

Python中的logging模塊是一個強大的、靈活的、可配置的日志記錄系統。它允許你在不修改源代碼的情況下記錄錯誤和調試信息&#xff0c;同時也可以對日志信息進行各種處理&#xff0c;例如寫入到文件、輸出到控制臺、記錄到數據庫等。 logging模塊提供了一種用于日志記錄的通用接…

液態二氧化碳儲存罐遠程無線監測系統

二氧化碳強化石油開采技術&#xff0c;須先深入了解石油儲層的地質特征和二氧化碳的作用機制。現場有8輛二氧化碳罐裝車&#xff0c;每輛罐車上有4臺液態二氧化碳儲罐&#xff0c;每臺罐的尾部都裝有一臺西門子S7-200 smart PLC。在注入二氧化碳的過程中&#xff0c;中控室S7-1…

國產單片機XL32F001,價格便宜,性價比高,32位M0+內核

XL32F001芯片簡介 1、是一個32位ARM架構Cortex -M0系列的單片機 2、系統工作頻率最高為24MHz 3、擁有24Kbytes Flash存儲器和3Kbytes SRAM 4、擁有內部24MHz和32.768MHz的RC振蕩器&#xff08;HSI和LSI&#xff09;&#xff0c;擁有32.768KHz低速晶體振蕩器&#xff08;LSE…