Grails Spring安全插件图像访问控制

时间:2012-04-06 02:53:16

标签: grails spring-security

我正在尝试创建一个在线照片库,用户可以将用户从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相关联。 我的问题是,如何使其不是图像所有者的用户无权查看图像? 我试着搜索谷歌的答案,并没有找到很多有用的答案。 谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

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

其次,我已经处理了几种不同的方式。

  • 通过Grails Controller将图像流回。这样,您就可以直接访问图像请求并处理您想要的任何类型的安全性,包括检查角色等。

非常简单的版本,没有考虑缓存,响应标头等:

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

}
}