背景

到目前,本系统存储的图片,都是可以匿名访问的图(产品图片),只要知道图片的url,就可访问图片。

由于业务需要,系统接收了用户上传的身份证、营业执照的图片,这些图片需要保密,不能泄漏到互联网上。

这里要需要访问控制了。

解决方案

文件存储中有一个safe安全区,本区中存储着 身份证照片、营业执照图片等,访问safe安全区图片时需要带着AccessKey才可访问。

使用AccessKey可让用户(浏览器)通过http协议直接访问图片。

1、用户浏览器访问A业务系统。
2、A业务系统判定用户是否有访问权限,若有权则生成accessKey(需要密码)。
3、A业务系统向用户响应页面,页面中包含图片url和accessKey。
4、用户浏览器带着accessKey来访问图片。
5、图片了系统验证accessKey有效性(需要密码),若合格就响应图片,若不合格就响应403.

单独存储

文件单独使用safe文件夹来存储,身份证、营业执照图片要单独存储,不与商品图片存储在一块。

本地文件系统方案LocalFileStorage:存储在/upload/filestorage/safe/目录下

阿里云OSS方案:未实现

访问控制

FileStorageDownloadServlet类负责处理通过http协议对图片的访问。负责权限检查,当访问safe区中的文件时,需要验证accessKey。

禁止来处互联网的对safe文件夹未授权访问。

示例:(禁止来自互联网的未授权访问)
/upload/filestorage/safe/58/52/38256d44f2da4fdcacba43f20d2b1982.jpg
/upload/filestorage/safe/58/52/38256d44f2da4fdcacba43f20d2b1982.jpg@!160X160

示例:带accessKey访问

http://127.0.0.1:8080/upload/filestorage/safe/00/81/abc.jpg@100x100?accessKey=e35339c9e1c2c80ab6723ba5055596c9

http://127.0.0.1:8080/upload/filestorage/safe/00/81/abc.jpg?accessKey=e35339c9e1c2c80ab6723ba5055596c9

注:实时生成缩略图功能依然好使。

accessKey

是一个访问密钥,由com.sicheng.common.fileStorage.AccessKey类负责生成accessKey、验证accessKey是否合格。

accessKey是一个加密的字符串,可从中解密出时间有效期。

accessKey的有效期是30分钟,过期后将失效。一个accessKey在有效期内,可被反复使用。

密码

fdp.properties核心配置文件中需要配置一个密码,用于加密、解密accessKey。

示例:filestorage.password = djei39f83

密码长度大于8,数字与字母的混合。

在系统上线时,建议人工随机修改本值,只修改这里一处就可,不要使用默认密码。

写入安全区

FileStorage接口新增加3个方法,用于把文件写入safe目录
public String fileNameSafe();
public String fileNameSafe(String fileExtName);
public String writeSafe(byte[] data, String fileExtName) throws IOException;