0

ユーザーがAndroidなどのモバイルデバイスからサーバーに画像をアップロードしてアクセスできるオンラインフォトライブラリを作成しようとしています。現在、Spring Security Plugin CoreでGrailsを使用しており、アップロードされたすべての画像を/ web-app/uploaded-imageのフォルダーに保存しました。アップロード部分は現在機能しており、デバイスからサーバーのuploaded-imageフォルダーに画像をアップロードできます。ただし、私が持っている1つの質問は、現在Config.groovyでこれらの行を使用してアクセス制御部分を実行していることです。

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

私は、コントローラーにイメージのパスを、各ユーザーのDomainClassに関連付けられるimageというDomainClassに関連付けることを計画しました。私の質問は、画像の所有者ではないユーザーが画像を表示する権限を持たないようにするにはどうすればよいですか?私は答えをグーグルで検索しようとしましたが、多くの有用な答えは見つかりませんでした。お時間をいただきありがとうございます。

4

2 に答える 2

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 に画像のストリーミングのすべての重要な詳細を処理させます。ただし、この場合のセキュリティの処理方法はわかりません。

于 2012-04-06T11:49:36.187 に答える
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")

}
}
于 2012-04-06T20:36:03.137 に答える