我正在尝试创建一个在线照片库,用户可以将用户从Android等移动设备上传图片到服务器并进行访问。 目前我正在使用带有Spring Security Plugin Core的Grails,我将所有上传的图像保存在/ web-app / uploaded-image的文件夹中。上传部分当前正在工作,我可以将图像从我的设备上传到服务器的upload-image文件夹。 但是,我有一个问题是,目前我在Config.groovy中使用这些行来执行访问控制部分
grails.plugins.springsecurity.interceptUrlMap = [
/uploaded_image/**':['IS_AUTHENTICATED_REMEMBERED']
]
我计划让控制器将图像的路径关联到一个名为image的DomainClass,该域将与每个用户的DomainClass相关联。 我的问题是,如何使其不是图像所有者的用户无权查看图像? 我试着搜索谷歌的答案,并没有找到很多有用的答案。 谢谢你的时间。
答案 0 :(得分:1)
首先,将图像上传到爆炸的WAR路径是一个坏主意。必须部署更新时会发生什么?最好将图像完全存储在WAR结构之外。
其次,我已经处理了几种不同的方式。
非常简单的版本,没有考虑缓存,响应标头等:
def avatarFilePath = new File(userInstance.avatarURL)
response.setContentType("application/png")
response.setContentLength(avatarFilePath.size().toInteger())
OutputStream out = response.getOutputStream();
out.write(avatarFilePath.bytes);
out.close();
将图像存储在某个内容存储库(可能是AmazonS3)中,然后通过提供程序API控制权限,或让您自己的控制器管理安全性,然后通过提供程序进行适当的重定向。
在Tomcat / Container前面使用Apache,让Apache处理流回图像的所有细节。但是,我不确定如何处理这种情况下的安全性。
答案 1 :(得分:0)
您可以使用以下逻辑来确保不是图像所有者的用户无权查看图像
class ImageController {
def springSecurityService
def showImage() {
Image image=Image.get(parmas.long("id")
// this is the user who is trying to access image from ui
User user = User.get(image.userId)
//this is the logged-in user
User logged = User.get(springSecurityService.principal.id)
if (user.id != logged.id) {
{
redirect(action: "accessDenied", controller='access' id: params.long("id"))
//re-direct accessDenied page
}else{
//show image
}
}
Class AccessController{
def accessDenied= {
render(view: "accessDenied")
}
}