這個系列有3篇文章:
- spring boot cas 服務(wù)端和spring security客戶端搭建(一):主要介紹怎么用spring boot cas搭建https的服務(wù)端
- spring boot cas 服務(wù)端和spring security客戶端搭建(二):主要介紹怎么用怎么結(jié)合數(shù)據(jù)庫用cas提供的動態(tài)加密方式登錄及相關(guān)配置
- spring boot cas 服務(wù)端和spring security客戶端搭建(三):主要介紹怎么結(jié)合spring security客戶端進行整合及http方式登錄配置
接著上篇spring boot cas 服務(wù)端和spring security客戶端搭建(一)繼續(xù)介紹服務(wù)端的搭建。上文已經(jīng)搭建好了默認(rèn)的基于https和靜態(tài)用戶的CAS服務(wù)端,實際中不會有項目那么處理的燥筷,需要連接數(shù)據(jù)庫或者其他形式來進行用戶認(rèn)證堤器;
所有配置的內(nèi)容可以參考https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html彼硫。
這里主要介紹連接數(shù)據(jù)庫的方式润匙。搜索‘Database Authentication’可以找到相關(guān)的內(nèi)容:
可以發(fā)現(xiàn)DataBase Authentication分為Query Database Authentication琅关,Search Database Authentication革骨,Bind Database Authentication,Encode Database Authentication屉符。
這里主要介紹下Encode Database Authentication剧浸,加密數(shù)據(jù)庫驗證。
所有的都是以cas.authn.jdbc.encode[0]為前綴筑煮,其中
sql表示需要查詢的用戶表以及登錄時用戶名對應(yīng)的列名
passwordFiledName表示對應(yīng)密碼的列名
expiredFiledName表示對應(yīng)失效的列名
disableFieldName表示對應(yīng)禁止的列名
driverClass, dialect, url, user, password都是數(shù)據(jù)庫相關(guān)的連接信息這里就不過多描述了
numberOfIterations表示加密迭代次數(shù)
numberOfIterationsFieldName表示對應(yīng)的加密迭代次數(shù)的列名
saltFieldName表示用哪列作為動態(tài)的鹽值
staticSalt表示靜態(tài)的鹽值
algorithmName表示加密算法
這里的加密方式是CAS提供的辛蚊,我們看下具體是怎么驗證的。在IDE中打開encode 驗證的核心類QueryAndEncodeDatabaseAuthenticationHandler真仲,找到對應(yīng)的驗證方法:
可以看到加密的核心方法就在digestEncodedPassword中處理的:
我們在保存密碼時需要按照通用的邏輯把上面的代碼抽出來袋马,才能保證存到數(shù)據(jù)庫的密碼和CAS配置的加鹽驗證一致。以下代碼僅供參考:
/**
* cas加密工具類秸应,參照QueryAndEncodeDatabaseAuthenticationHandler中的digestEncodedPassword實現(xiàn)
* @param encodedPass
* @param dynaSalt
* @param staticSalt
* @param algorithmName
* @param numberOfIterations
* @return
*/
public static String digestEncodedPassword (String encodedPass, String dynaSalt, String staticSalt, String algorithmName, Long numberOfIterations) {
ConfigurableHashService hashService = new DefaultHashService();
if (StringUtils.isNoneBlank(staticSalt)) {
hashService.setPrivateSalt(ByteSource.Util.bytes(staticSalt));
}
hashService.setHashAlgorithmName("MD5");
hashService.setHashIterations(numberOfIterations.intValue());
final HashRequest request = new HashRequest.Builder()
.setSalt(dynaSalt)
.setSource(encodedPass)
.build();
return hashService.computeHash(request).toHex();
}
當(dāng)然僅僅上面的配置是無法實現(xiàn)數(shù)據(jù)庫連接的虑凛,我們需要在工程的pom文件中添加數(shù)據(jù)庫包及CAS依賴才可以實現(xiàn)加密的數(shù)據(jù)庫連接認(rèn)證:
具體的數(shù)據(jù)庫包根據(jù)具體使用的來定碑宴,jdbc認(rèn)證需要添加cas的依賴包(版本和cas版本保持一致):
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
到這里基于CAS的數(shù)據(jù)庫加密驗證就結(jié)束了。其他驗證方式請參考官方文檔桑谍,我這邊也只測試過基礎(chǔ)的query方式延柠,配置如下:
除去加密部分,數(shù)據(jù)庫連接相關(guān)的和encode的沒什么太大差異锣披,只是前綴變成了cas.authn.jdbc.query[0]贞间,和encode相比就是encode變成了query。
其實看下源碼可以發(fā)現(xiàn)所有的數(shù)據(jù)庫驗證方式都在同一個包中雹仿,具體的驗證參考具體的類和方法即可:
CAS服務(wù)的數(shù)據(jù)庫連接的相關(guān)配置就到這了增热。下篇描述下怎么和spring boot security的客戶端集成,以及CAS服務(wù)端http方式的驗證胧辽。