SpringBoot集成Milton(webdav)應(yīng)用實例(二)
原來愛沒有
遺棄我
你的愛會將我灌醉
我沒有所謂
太過清醒怎么陶醉
你的愛
像是杯太濃的咖啡
讓我失眠徹夜
好愛這種感覺
這里接著前面的繼續(xù),上次有了一個簡單的demo,這里對上次的代碼進行一些說明,SpringMiltonFilter類中,有個MiltonProperties配置類,該配置類,主要用于配置一些webdav服務(wù)用到的一些參數(shù)設(shè)置,目前主要用到了2個,一個是用于判斷哪些請求用來識別為使用milton來處理的webdav請求,一個是配置milton的Resource控制器掃描包路徑。這里利用的是SpringBoot的元數(shù)據(jù)配置,即在META-INF/spring-configuration-metadata.json中定義配置信息,然后在yaml文件中指定值,

之后,在yaml文件中,就可以指定配置屬性的值了:

同時配置類MiltonProperties
需要添加Configuration和ConfigurationProperties注解
ConfigurationProperties注解需要設(shè)定prefix的值,如上面截圖,prefix的值為milton.deal,此時spring會根據(jù)配置,獲取MiltonProperties類中的setXXX方法,給相應(yīng)的屬性賦值:
package?com.lgli.webdav.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import?org.springframework.context.annotation.Configuration;
import java.util.List;
/**
?*?milton配置類
*
* @author lgli
?*/
(prefix = "milton.deal")
public class MiltonProperties {
private List<String> httpUrl;
private String controller;
public List<String> getHttpUrl() {
return httpUrl;
}
public void setHttpUrl(List<String> httpUrl) {
this.httpUrl = httpUrl;
}
public String getController() {
return controller;
}
public void setController(String controller) {
this.controller = controller;
????}
}
即這里spring或通過調(diào)用setController 方法將配置文件中的
milton.deal.controller的值賦予給controller屬性,類似的會給httpUrl集合賦值。
之后,就可以獲取MiltonProperties中的屬性值了。
此外,上次demo中的SpringMiltonFilter攔截器中的Bean依賴注入,在高版本的SpringBoot中會產(chǎn)生循環(huán)依賴,這個需要處理下,demo就無所謂了,了解關(guān)聯(lián)關(guān)系了,每個人都可以重新整理下了。
這里再次圖解下,milton的過程:

HttpManagerBuilder通過ResourceFactory生成一個HttpManager用于處理來自客戶端的webdav請求。
下面接著分析具體的處理類Controller,即上次提到的
ResourceManageController類
01
—
Milton區(qū)分文件或者文件夾
首先webdav要先根據(jù)注解@Root,識別到根文件夾方法,根文件夾,肯定是一個文件夾,這個毋庸置疑,但是這個文件夾中,可能會有文件,也可能有文件夾,那么Milton是如何來識別并告知客戶端,哪個是文件,哪個又是文件夾呢?
通常來說,Milton會根據(jù)@ChildrenOf注解標準的方法,來判斷是不是有子文件,也就是說,某個實體,在后端能通過@ChildrenOf找到子集,那么這個實體就是文件夾,否則就是一個文件。
所以來看下@Root方法和@ChildrenOf方法:

@Root注解方法返回了一個實體,這個實體在本例中表示一個文件夾,上面已經(jīng)說到,根文件夾一定是個文件夾,然后看到@ChildrenOf注解方法,需要傳入一個FolderEntity實體,也就是說,父實體如果是FolderEntity類型的,則是一個文件夾,它擁有子集,否則的話,則是一個文件??梢钥吹剑珸Root注解方法返回的是一個FolderEntity實體,它是一個文件夾,就自然有子集,也就因此會調(diào)用@ChildrenOf注解方法,這時候,這個實體是沒有ID的<因為@Root注解方法沒有設(shè)定ID>,方法走第一個if,返回了一個list,這個list中有3個類,其中2個是FolderEntity類型的,另外一個是FileEntity類型的,由于FileEntity類型的在服務(wù)端是找不到有@ChildrenOf標準的獲取子集的方法,所以FileEntity類型的就會是一個文件,而FolderEntity類型的是個文件夾。這里的FolderEntity和FileEntity是自己定義的,大家可以隨意根據(jù)自己的需要來定義。這樣一來,milton就告訴了客戶端,什么是文件,什么是文件夾了!
02
—
權(quán)限認證
上次的服務(wù),沒有使用權(quán)限認證,導(dǎo)致所有人都可以訪問,那么對于真實項目而言,首先要做的就是權(quán)限用戶認證,即每個登錄人需要可以看到自己的文件夾數(shù)據(jù),這里也是模擬一個實際的項目的一個需求。
那么首先,回憶下上次的demo,在構(gòu)建ResourceFactory的時候,傳入了一個
io.milton.http.fs.NullSecurityManager

這里看下這個Milton默認實現(xiàn)的安全管理器,
實現(xiàn)了Milton的
io.milton.http.SecurityManager
接口,同時實現(xiàn)它的5個方法,這5個方法,分別表示什么意思?這里簡單做個說明
方法一:
io.milton.http.fs.NullSecurityManager#authenticate(io.milton.http.http11.auth.DigestResponse)
方法表示:對一個digest的請求做認證,這里不詳述什么是digest請求,有需要的可以去看看HTTP AUTH和HTTP DIGEST AUTH的區(qū)別,相較于http auth而言,http digest auth在安全方面相對而言更好一些。
方法二:
io.milton.http.fs.NullSecurityManager#authenticate(java.lang.String, java.lang.String)
方法表示:通過獲取客戶端傳入的用戶名和密碼,做權(quán)限校驗
方法三:
io.milton.http.fs.NullSecurityManager#authorise(io.milton.http.Request,io.milton.http.Request.Method,io.milton.http.Auth,io.milton.resource.Resource)
方法表示:校驗方法二返回的authenticater user是否能夠進入給定請求方法返回的資源
方法四:
io.milton.http.fs.NullSecurityManager#getRealm(java.lang.String)
方法表示:返回給定客戶端主機被安全管理器管理的領(lǐng)域的名稱,這里我的理解就是,返回一個給定的領(lǐng)域名稱,方便客戶端在有領(lǐng)域區(qū)分的時候,做權(quán)限識別
方法五:
io.milton.http.fs.NullSecurityManager#isDigestAllowed
方法表示:是否允許digest請求,通常是返回true,除非不想用http digest?auth做服務(wù)端權(quán)限認證
這里我們先要明確Milton在處理權(quán)限的時候的一個大體邏輯,Milton其底層邏輯對權(quán)限處理的時候,是資源校驗權(quán)限,即首先獲取資源,然后判斷當(dāng)前用戶是否擁有這個資源的權(quán)限。即,Milton的權(quán)限在獲取資源之后。
這個是系統(tǒng)默認實現(xiàn)的一個空的安全管理器,如果我們需要有一個自己的安全管理器,也可以自定義一個類,實現(xiàn)
io.milton.http.SecurityManager 接口這里先使用一個系統(tǒng)默認實現(xiàn)的另一個安全管理器來看下效果:
這里在創(chuàng)建ResourceFactory的時候,new一個
io.milton.http.fs.SimpleSecurityManager

這里的意思是,只有user用戶才可以擁有訪問的資源的權(quán)限,同時指定的了密碼是password。

這里簡單實現(xiàn)了需要通過登錄認證,從而達到用戶管理的效果了。
但是一般來說,我們可能需要有自定義的一個用戶認證,同時,需要先用戶登錄,然后通過用戶,獲取用戶應(yīng)該有的資源,這種方式又怎么實現(xiàn)呢?
下期繼續(xù)?。?!
如果你也感興趣,麻煩多多支持。謝謝!
如有錯誤,煩請指正。
點擊公眾號獲取更多
