SpringBoot集成Milton(webdav)应用实例(二)
共 7310字,需浏览 15分钟
·
2023-05-13 20:16
原来爱没有
遗弃我
你的爱会将我灌醉
我没有所谓
太过清醒怎么陶醉
你的爱
像是杯太浓的咖啡
让我失眠彻夜
好爱这种感觉
这里接着前面的继续,上次有了一个简单的demo,这里对上次的代码进行一些说明,SpringMiltonFilter类中,有个MiltonProperties配置类,该配置类,主要用于配置一些webdav服务用到的一些参数设置,目前主要用到了2个,一个是用于判断哪些请求用来识别为使用milton来处理的webdav请求,一个是配置milton的Resource控制器扫描包路径。这里利用的是SpringBoot的元数据配置,即在META-INF/spring-configuration-metadata.json中定义配置信息,然后在yaml文件中指定值,
之后,在yaml文件中,就可以指定配置属性的值了:
同时配置类MiltonProperties
需要添加Configuration和ConfigurationProperties注解
ConfigurationProperties注解需要设定prefix的值,如上面截图,prefix的值为milton.deal,此时spring会根据配置,获取MiltonProperties类中的setXXX方法,给相应的属性赋值:
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
*/
"milton.deal") (prefix =
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或通过调用setController 方法将配置文件中的
milton.deal.controller的值赋予给controller属性,类似的会给httpUrl集合赋值。
之后,就可以获取MiltonProperties中的属性值了。
此外,上次demo中的SpringMiltonFilter拦截器中的Bean依赖注入,在高版本的SpringBoot中会产生循环依赖,这个需要处理下,demo就无所谓了,了解关联关系了,每个人都可以重新整理下了。
这里再次图解下,milton的过程:
HttpManagerBuilder通过ResourceFactory生成一个HttpManager用于处理来自客户端的webdav请求。
下面接着分析具体的处理类Controller,即上次提到的
ResourceManageController类
01
—
Milton区分文件或者文件夹
首先webdav要先根据注解@Root,识别到根文件夹方法,根文件夹,肯定是一个文件夹,这个毋庸置疑,但是这个文件夹中,可能会有文件,也可能有文件夹,那么Milton是如何来识别并告知客户端,哪个是文件,哪个又是文件夹呢?
通常来说,Milton会根据@ChildrenOf注解标准的方法,来判断是不是有子文件,也就是说,某个实体,在后端能通过@ChildrenOf找到子集,那么这个实体就是文件夹,否则就是一个文件。
所以来看下@Root方法和@ChildrenOf方法:
@Root注解方法返回了一个实体,这个实体在本例中表示一个文件夹,上面已经说到,根文件夹一定是个文件夹,然后看到@ChildrenOf注解方法,需要传入一个FolderEntity实体,也就是说,父实体如果是FolderEntity类型的,则是一个文件夹,它拥有子集,否则的话,则是一个文件。可以看到,@Root注解方法返回的是一个FolderEntity实体,它是一个文件夹,就自然有子集,也就因此会调用@ChildrenOf注解方法,这时候,这个实体是没有ID的<因为@Root注解方法没有设定ID>,方法走第一个if,返回了一个list,这个list中有3个类,其中2个是FolderEntity类型的,另外一个是FileEntity类型的,由于FileEntity类型的在服务端是找不到有@ChildrenOf标准的获取子集的方法,所以FileEntity类型的就会是一个文件,而FolderEntity类型的是个文件夹。这里的FolderEntity和FileEntity是自己定义的,大家可以随意根据自己的需要来定义。这样一来,milton就告诉了客户端,什么是文件,什么是文件夹了!
02
—
权限认证
上次的服务,没有使用权限认证,导致所有人都可以访问,那么对于真实项目而言,首先要做的就是权限用户认证,即每个登录人需要可以看到自己的文件夹数据,这里也是模拟一个实际的项目的一个需求。
那么首先,回忆下上次的demo,在构建ResourceFactory的时候,传入了一个
io.milton.http.fs.NullSecurityManager
这里看下这个Milton默认实现的安全管理器,
实现了Milton的
io.milton.http.SecurityManager
接口,同时实现它的5个方法,这5个方法,分别表示什么意思?这里简单做个说明
方法一:
io.milton.http.fs.NullSecurityManager#authenticate(io.milton.http.http11.auth.DigestResponse)
方法表示:对一个digest的请求做认证,这里不详述什么是digest请求,有需要的可以去看看HTTP AUTH和HTTP DIGEST AUTH的区别,相较于http auth而言,http digest auth在安全方面相对而言更好一些。
方法二:
io.milton.http.fs.NullSecurityManager#authenticate(java.lang.String, java.lang.String)
方法表示:通过获取客户端传入的用户名和密码,做权限校验
方法三:
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)
方法表示:返回给定客户端主机被安全管理器管理的领域的名称,这里我的理解就是,返回一个给定的领域名称,方便客户端在有领域区分的时候,做权限识别
方法五:
io.milton.http.fs.NullSecurityManager#isDigestAllowed
方法表示:是否允许digest请求,通常是返回true,除非不想用http digest auth做服务端权限认证
这里我们先要明确Milton在处理权限的时候的一个大体逻辑,Milton其底层逻辑对权限处理的时候,是资源校验权限,即首先获取资源,然后判断当前用户是否拥有这个资源的权限。即,Milton的权限在获取资源之后。
这个是系统默认实现的一个空的安全管理器,如果我们需要有一个自己的安全管理器,也可以自定义一个类,实现
io.milton.http.SecurityManager 接口这里先使用一个系统默认实现的另一个安全管理器来看下效果:
这里在创建ResourceFactory的时候,new一个
io.milton.http.fs.SimpleSecurityManager
这里的意思是,只有user用户才可以拥有访问的资源的权限,同时指定的了密码是password。
这里简单实现了需要通过登录认证,从而达到用户管理的效果了。
但是一般来说,我们可能需要有自定义的一个用户认证,同时,需要先用户登录,然后通过用户,获取用户应该有的资源,这种方式又怎么实现呢?
下期继续!!!
如果你也感兴趣,麻烦多多支持。谢谢!
如有错误,烦请指正。
点击公众号获取更多