背景
到目前,本系统存储的图片,都是可以匿名访问的图(产品图片),只要知道图片的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;