【问题标题】:Grails Spring Security Plugin Image Access ControlGrails Spring Security 插件图像访问控制
【发布时间】:2012-04-19 18:47:02
【问题描述】:

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

grails.plugins.springsecurity.interceptUrlMap = [
/uploaded_image/**':['IS_AUTHENTICATED_REMEMBERED']
]

我计划让控制器将图像的路径与名为 image 的 DomainClass 相关联,该 DomainClass 将与每个用户的 DomainClass 相关联。 我的问题是,我该如何做才能使不是图像所有者的用户无权查看图像? 我尝试在谷歌搜索答案并没有找到很多有用的答案。 感谢您的宝贵时间。

【问题讨论】:

  • 我不确定这是否是解决问题的最佳方法,但我最终使用 Requestmap 方式进行访问控制,然后添加一个新的 Requestmap 只允许上传的用户每次上传新文件时访问它。似乎每次有人上传图片时都必须清除缓存,所以我不确定这是否是一个好的解决方案,看起来它现在有点像我想要的。

标签: grails spring-security


【解决方案1】:

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

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

  • 通过 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/Container 前面使用 Apache,并让 Apache 处理将图像流回的所有细节。但是,我不确定在这种情况下如何处理安全问题。

【讨论】:

  • 感谢您的回复。我真的很想接受这两个答案,但它只允许我接受一个。不过,非常感谢您的回复。按照您的建议,我将上传的图像文件夹移出 WAR 路径。目前它工作得很好。再次感谢
【解决方案2】:

您可以使用以下逻辑来确保不是图像所有者的用户无权查看图像

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

}
}

【讨论】:

  • 感谢您的回复。你的代码真的帮助我理解了大局。再次感谢您。
  • 我真的希望我能对这两个答案都投赞成票。但是,我还没有足够的声望来投票。
猜你喜欢
  • 2012-09-04
  • 2014-12-23
  • 2015-08-25
  • 2013-01-17
  • 2016-05-24
  • 1970-01-01
  • 2012-04-10
  • 2011-08-15
  • 2016-03-23
相关资源
最近更新 更多