GrailsSpring安全插件图像访问控制

GrailsSpring安全插件图像访问控制,grails,spring-security,Grails,Spring Security,我正在尝试制作一个在线照片库,用户可以从Android等移动设备将图像上传到服务器并访问它。 当前我正在使用Grails with Spring Security Plugin Core,我将所有上传的图像保存在/web app/upload image文件夹中。上载部分当前正在工作,我可以将图像从我的设备上载到服务器上载图像文件夹。 然而,我的一个问题是,目前我正在Config.groovy中使用这些行来执行访问控制部分 grails.plugins.springsecurity.interc

我正在尝试制作一个在线照片库,用户可以从Android等移动设备将图像上传到服务器并访问它。 当前我正在使用Grails with Spring Security Plugin Core,我将所有上传的图像保存在/web app/upload image文件夹中。上载部分当前正在工作,我可以将图像从我的设备上载到服务器上载图像文件夹。 然而,我的一个问题是,目前我正在Config.groovy中使用这些行来执行访问控制部分

grails.plugins.springsecurity.interceptUrlMap = [
/uploaded_image/**':['IS_AUTHENTICATED_REMEMBERED']
]
我计划让控制器将映像的路径与名为image的DomainClass关联,该DomainClass将与每个用户的DomainClass关联。 我的问题是,如何使不是图像所有者的用户没有查看图像的权限? 我试着在谷歌上搜索答案,但并没有找到很多有用的答案。
谢谢您的时间。

首先,将图像上传到爆炸战争路径是个坏主意。当您必须部署更新时会发生什么?最好将图像完全存储在战争结构之外

其次,我用了几种不同的方法来处理这个问题

  • 通过Grails控制器将图像流回。这样,您就可以直接访问映像请求,并处理您想要的任何类型的安全性,包括检查角色等
非常简单的版本,不考虑缓存、响应头等:

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/容器前面使用Apache,让Apache处理流式处理图像的所有细节。然而,我不知道如何处理这种情况下的安全问题


您可以使用以下逻辑确保非图像所有者的用户没有查看图像的权限

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")

}
}

我不确定这是否是解决问题的最佳方法,但我最终使用Requestmap方法来进行访问控制,然后添加一个新的Requestmap,它只允许上传它的用户在每次上传新文件时访问它。似乎每次有人上传一张图片时,缓存都必须被清除,所以我不确定这是否是一个好的解决方案,而且现在看起来它有点像我想要的。谢谢你的回复。我真的想接受这两个答案,但它只允许我接受一个。不过,非常感谢您的回复。我按照您的建议将上载的图像文件夹移出WAR路径。目前为止,它工作得相当好。再次感谢您的回复。你的代码真的帮助我了解了大局。再次谢谢你。我真希望我能投票支持两个答案。然而,我还没有足够的声望去投票。