松哥給最近連載的 Spring Security 系列也錄制了視訊教程,感興趣的小夥伴請戳這裡->Spring Boot+Vue+微人事視訊教程(Spring Boot 第十章就是 Spring Security)。
在前面的兩篇文章中,松哥和大家分享了 CAS Server 的搭建以及如何使用 Spring Security 搭建 CAS Client。
但是前面的案例有一個問題,就是登入使用者是在 CAS Server 配置檔案中寫死的,沒有對接資料庫,實際項目中,這裡肯定要對接資料庫,是以今天,松哥就來和大家聊一聊 CAS Server 如何對接資料庫。
松哥最近和 Spring Security 杠上了,這是 Spring Security 系列的第 25 篇:
- 挖一個大坑,Spring Security 開搞!
- 松哥手把手帶你入門 Spring Security,别再問密碼怎麼解密了
- 手把手教你定制 Spring Security 中的表單登入
- Spring Security 做前後端分離,咱就别做頁面跳轉了!統統 JSON 互動
- Spring Security 中的授權操作原來這麼簡單
- Spring Security 如何将使用者資料存入資料庫?
- Spring Security+Spring Data Jpa 強強聯手,安全管理隻有更簡單!
- Spring Boot + Spring Security 實作自動登入功能
- Spring Boot 自動登入,安全風險要怎麼控制?
- 在微服務項目中,Spring Security 比 Shiro 強在哪?
- SpringSecurity 自定義認證邏輯的兩種方式(進階玩法)
- Spring Security 中如何快速檢視登入使用者 IP 位址等資訊?
- Spring Security 自動踢掉前一個登入使用者,一個配置搞定!
- Spring Boot + Vue 前後端分離項目,如何踢掉已登入使用者?
- Spring Security 自帶防火牆!你都不知道自己的系統有多安全!
- 什麼是會話固定攻擊?Spring Boot 中要如何防禦會話固定攻擊?
- 叢集化部署,Spring Security 要如何處理 session 共享?
- 松哥手把手教你在 SpringBoot 中防禦 CSRF 攻擊!so easy!
- 要學就學透徹!Spring Security 中 CSRF 防禦源碼解析
- Spring Boot 中密碼加密的兩種姿勢!
- Spring Security 要怎麼學?為什麼一定要成體系的學習?
- Spring Security 兩種資源放行政策,千萬别用錯了!
- 聊一聊 Spring Boot 中的 CAS 單點登入
- Spring Boot 實作單點登入的第三種方案!
1.整體思路
先來看整體思路。
我們用 CAS Server 做單點登入,CAS Server 主要是負責認證的,也就是它主要解決登入問題。登入成功之後,還有一個權限處理的問題,權限的問題則交由各個 CAS Client 自行處理,并不在 CAS Server 中完成。
在上篇文章中,松哥有教過大家定義 UserDetailsService,不知道大家是否還記得如下代碼(忘記了可以參考上篇文章:Spring Boot 實作單點登入的第三種方案!):
@Component
這段代碼是在什麼時候執行呢?
如果我們沒有使用 CAS 這一套的話,這段代碼當然是在使用者登入的時候執行,使用者登入時,從資料庫中查詢使用者的資訊,然後做校驗(參考本系列前面文章就懂)。
如果我們使用 CAS 這一套,使用者登入的校驗将在 CAS Server 上執行,CAS Client 就不用做校驗工作了,但是為什麼我們還需要定義 UserDetailsService 呢?這是為了當使用者在 CAS Server 上登入成功之後,拿着使用者名回到 CAS Client,然後我們再去資料庫中根據使用者名擷取使用者的詳細資訊,包括使用者的角色等,進而在後面的鑒權中用上角色。
好了,這是我們一個大緻的思路,接下來我們來看具體實作。
2.具體實作
接下來的配置在 松哥手把手教你入門 Spring Boot + CAS 單點登入 一文的基礎上完成,是以還沒看前面文章的小夥伴建議先看一下哦。
2.1 準備工作
首先我們先在資料庫中準備一下使用者表、角色表以及使用者角色關聯表:
CREATE
2.2 CAS Server
然後我們要在 CAS Server 的 pom.xml 檔案中添加兩個依賴:
注意這裡不用添加資料庫驅動,系統會自動解決。
添加完成之後,再在 src/main/resources/application.properties 檔案中添加如下配置:
- 前三行配置是資料庫基本連接配接配置,這個無需我多說。
- 第四行表示配置使用者查詢 sql,根據使用者名查詢出使用者的所有資訊。
- 第五行表示資料庫中密碼的字段名字是什麼。
- 第六行是資料庫驅動。
OK,配置完成後,接下來我們就來重新開機 CAS Server:
啟動成功後,浏覽器輸入 https://cas.javaboy.org:8443/cas/login 就可以進入登入頁面了(注意是 https 哦):

此時登入使用者名就是 javaboy,密碼是 123。
2.3 CAS Client
接下來我們再來看看 CAS Client 要做哪些完善。
接下來的配置在 Spring Boot 實作單點登入的第三種方案! 一文的基礎上完成,是以還沒看前面文章的小夥伴建議先看一下哦。
同時,為了案例簡潔,我這裡使用 JPA 來操作資料庫,要是大家不熟悉這塊的操作,可以參考本系列之前的文章:Spring Security+Spring Data Jpa 強強聯手,安全管理隻有更簡單!。
CAS Client 中的對接主要是實作 UserDetailsService 接口。這裡要用到資料庫查詢,是以我們首先添加資料庫相關依賴:
<dependency>
然後在 application.properties 中配置資料庫連接配接資訊:
都是正常配置,我們就不再重複解釋了。
接下來我們建立兩個實體類,分别表示使用者角色了使用者類:
使用者角色:
@Entity(name =
這個實體類用來描述使用者角色資訊,有角色 id、角色名稱(英文、中文),@Entity 表示這是一個實體類,項目啟動後,将會根據實體類的屬性在資料庫中自動建立一個角色表。
使用者實體類:
@Entity(name =
使用者實體類主要需要實作 UserDetails 接口,并實作接口中的方法。
這裡的字段基本都好了解,幾個特殊的我來稍微說一下:
- accountNonExpired、accountNonLocked、credentialsNonExpired、enabled 這四個屬性分别用來描述使用者的狀态,表示賬戶是否沒有過期、賬戶是否沒有被鎖定、密碼是否沒有過期、以及賬戶是否可用。
- roles 屬性表示使用者的角色,User 和 Role 是多對多關系,用一個 @ManyToMany 注解來描述。
- getAuthorities 方法傳回使用者的角色資訊,我們在這個方法中把自己的 Role 稍微轉化一下即可。
資料模型準備好之後,我們再來定義一個 UserDao:
public
這裡的東西很簡單,我們隻需要繼承 JpaRepository 然後提供一個根據 username 查詢 user 的方法即可。如果小夥伴們不熟悉 Spring Data Jpa 的操作,可以在公衆号背景回複 springboot 擷取松哥手敲的 Spring Boot 教程,裡邊有 jpa 相關操作,也可以看看松哥錄制的視訊教程:Spring Boot + Vue 系列視訊教程。
在接下來定義 UserService ,如下:
@Component
我們自己定義的 UserDetailsServiceImpl 需要實作 UserDetailsService 接口,實作該接口,就要實作接口中的方法,也就是 loadUserByUsername。
OK ,如此之後,我們的 CAS Client 現在就開發完成了,接下來啟動 CAS Client,啟動成功後,浏覽器輸入
http://client1.cas.javaboy.org:8080/user/hello
通路 hello 接口,此時會自動跳轉到 CAS Server 上登入,登入的使用者名密碼就是我們存儲在資料庫中的使用者名密碼。登入成功之後,經過兩個重定向,會重新回到 hello 接口。
hello 接口通路成功之後,再去通路
/user/hello
接口,就會發現權限配置也生效了。
這裡比較簡單,我就不給大家截圖了。
3.小結
好啦,今天主要和小夥伴們分享了一下 Spring Security + CAS 單點登入中,如何使用本地資料庫。一個核心的思路是,認證由 CAS Server 來做,權限相關的操作,則還是由 Spring Security 來完成。
好了 ,本文就說到這裡,本文相關案例我已經上傳到 GitHub ,大家可以自行下載下傳:https://github.com/lenve/spring-security-samples
好啦,小夥伴們如果覺得有收獲,記得點個在看鼓勵下松哥哦~
今日幹貨
剛剛發表檢視: 13500 回複:135
公衆号背景回複 SpringBoot,免費擷取 274 頁SpringBoot修煉手冊。