SpringBoot集成Milton(webdav)应用实例(二)

lgli

共 7310字,需浏览 15分钟

 ·

2023-05-13 20:16


原来爱没有

遗弃我

你的爱会将我灌醉

我没有所谓

太过清醒怎么陶醉

你的爱

像是杯太浓的咖啡

让我失眠彻夜

好爱这种感觉





这里接着前面的继续,上次有了一个简单的demo,这里对上次的代码进行一些说明,SpringMiltonFilter类中,有个MiltonProperties配置类,该配置类,主要用于配置一些webdav服务用到的一些参数设置,目前主要用到了2个,一个是用于判断哪些请求用来识别为使用milton来处理的webdav请求,一个是配置milton的Resource控制器扫描包路径。这里利用的是SpringBoot的元数据配置,即在META-INF/spring-configuration-metadata.json中定义配置信息,然后在yaml文件中指定值,


e5681e0757aad91847986e124b8e9183.webp

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


0a29c5ba53ce791f677ddf69bcafc157.webp

同时配置类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  */ @Configuration @ConfigurationProperties(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或通过调用setController 方法将配置文件中的

milton.deal.controller的值赋予给controller属性,类似的会给httpUrl集合赋值。

之后,就可以获取MiltonProperties中的属性值了。


此外,上次demo中的SpringMiltonFilter拦截器中的Bean依赖注入,在高版本的SpringBoot中会产生循环依赖,这个需要处理下,demo就无所谓了,了解关联关系了,每个人都可以重新整理下了。


这里再次图解下,milton的过程:


c8acff8ff09780e97051854cd441a332.webp

HttpManagerBuilder通过ResourceFactory生成一个HttpManager用于处理来自客户端的webdav请求。


下面接着分析具体的处理类Controller,即上次提到的

ResourceManageController类



01

Milton区分文件或者文件夹


首先webdav要先根据注解@Root,识别到根文件夹方法,根文件夹,肯定是一个文件夹,这个毋庸置疑,但是这个文件夹中,可能会有文件,也可能有文件夹,那么Milton是如何来识别并告知客户端,哪个是文件,哪个又是文件夹呢?


通常来说,Milton会根据@ChildrenOf注解标准的方法,来判断是不是有子文件,也就是说,某个实体,在后端能通过@ChildrenOf找到子集,那么这个实体就是文件夹,否则就是一个文件。


所以来看下@Root方法和@ChildrenOf方法:


7444680b983276493471fd6d8f693646.webp



@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


3f8526f5966136d76b22c6c2ed3837dd.webp



这里看下这个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

01b588c659af23eb0fc349d58cbe1daa.webp



这里的意思是,只有user用户才可以拥有访问的资源的权限,同时指定的了密码是password。

0b3403125725d9a3750c8e7c45e4bb18.webp



这里简单实现了需要通过登录认证,从而达到用户管理的效果了。



但是一般来说,我们可能需要有自定义的一个用户认证,同时,需要先用户登录,然后通过用户,获取用户应该有的资源,这种方式又怎么实现呢?


下期继续!!!



如果你也感兴趣,麻烦多多支持。谢谢!


如有错误,烦请指正。


点击公众号获取更多





浏览 373
点赞
1评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
全部评论
QS682464ea1fdca1a372023-08-26 23:55
为什么我这边@Childrenof最终返回length:null呢?访问回执404
点赞回复
推荐
点赞
1评论
收藏
分享

手机扫一扫分享

分享
举报