2016-11-19 7 views
2

Apache를 사용하여 장고 응용 프로그램을 배포하고 데코레이터를 사용하여 대부분의보기에서 인증을 확인합니다.Django - 사용자 정의 login_required 데코레이터로 Apache와 함께 제공되는 미디어 파일 보호

@custom_decorator 
def myView(request): 
    bla bla bla... 

그것은 장고와 함께 제공되는 @login_required 장식 아니지만, 그 특정 그룹의 사용자에게 액세스를 허용하는 것을 제외하고는 거의 같은 일입니다. 이는 의도 한대로 작동합니다.

Alias /media /path/to/media 
<Directory /path/to/media> 
    Require all granted 
</Directory 

내가 잘 미디어 파일에 액세스 할 수 있지만, 문제는 내가 만약 내가도 액세스 할 수 있다는 것입니다 : 또한

,이 같은 아파치와 미디어 (사용자가 업로드) 파일을 제공하고있어

mySite/media/myFile.png 

잘하면 사용자 정의 장식을 사용하여 미디어 파일에 대한 액세스를 제한 할 수있는 방법이 있나요 : 단순히처럼 수동으로 URL을 입력하여 로그인하지 않은거야?

나는 유사한 질문을 우연히 만났습니다 : How do you Require Login for Media Files in Django,하지만 불행히도 그 대답은 내 머리 위로갔습니다.

미리 감사드립니다.

답변

1

아파치에 대한 미디어 경로를 언급하면 ​​해당 파일은 Apache (또는 Nginx 또는 다른 웹 서버)에서 직접 제공됩니다. 이러한 요청은 장고 애플리케이션을 통과하지도 않습니다. 따라서 이러한 요청이나 요청한 데이터를 제어 할 권한이 없습니다.

정적/미디어 파일을 제공하기 위해 별도의 API를 만드는 것이 한 가지 방법입니다. 해당 API에서 다른 내용에 대해 수행하는 것과 동일한 유효성 검사를 사용하십시오. 당신이 AWS (Amazon Web Services) 또는 GCP (Google Cloud Platform) 계정이있는 경우

더 나은, 각각 S3 또는 Cloud Storage에 정적 파일을 저장하고 API를 통해 파일을 자신의 URL을 제공합니다.

PS : 경로를 Apache 구성에서 제거하는 것을 잊지 마십시오. 그렇지 않으면 아파치는 그 파일을 계속 제공 할 것입니다. Sarafeim's answer to Restricting access to private file downloads in Django에서 언급


대안 모두 단절 및 응용 측면에서 수정해야한다. 요청한 특정 사용자에게 파일을 제공 할 수 있는지 여부를 HTTP 서버에서 응용 프로그램 서버에 묻는 방법이 필요합니다. X-SendFile 메커니즘을 사용하는 django-sendfile을 사용하여이를 달성 할 수 있습니다. 장고 - sendfile을의 README에 따라 :

이 웹 클라이언트로 파일을 전송하는 웹 서버의 특정 방법의 래퍼입니다. 이것은 장고가 사용 권한 관련 파일을 확인해야하지만 파일 자체의 실제 바이트를 제공하고 싶지 않을 때 유용합니다. 즉 대용량 파일을 제공하는 것은 Django가 만들어진 것이 아닙니다.

sendfile을 메커니즘에 대한 자세한 내용을 이해하기 위해 읽어 Django - Understanding X-Sendfile

+1

도움이 답변을 주셔서 감사합니다, 나는 당신이 5 번, 하처럼 더 많은 정보를 추가하기 위해 그것을 편집 것으로 나타났습니다. 나는 해결책을 가진 원래 포스트를 편집했다, 고마워! – Sauvent

+1

@Sauvent : 원래 게시물의 답변으로 해당 정보를 추가하는 것이 더 좋았을 것입니다. 질문은 대답을위한 장소입니다. :) 또한, 돌아와서 당신이 한 일을 우리에게 알려 주셔서 감사합니다. 그것은 미래에 문제를 겪고있는 누군가에게 도움이 될 것입니다. –

+0

나는 어떻게 그것이 원래인지 질문을 편집하고 답변을 분리하여 게시했습니다. 감사합니다. – Sauvent

1

좋아, @MoinuddinQuadri 응답 및 링크를 기반으로, 가장 쉬운 솔루션은 일반 장고보기를 사용하여 파일을 제공하는 것입니다 것, 그리고 다음과 같이 원하는 장식을 적용

@custom_decorator 
viewFile(request, objectID): 
    object = MyModel.object.get(id = objectID) 
    return HttpResponse(object.file, content_type = "image/png") 

이 (내 경우에는, 내가보기에 내가 파일 이름 대신 객체의 ID를 전달하며,이 모델과 관련된 FileField와 서비스를 제공하고 싶었다).

또한, 나는 아파치의 conf에서 해당 코드에서 주석 :

### Alias /media /path/to/media 
### <Directory /path/to/media> 
###  Require all granted 
###</Directory 

내가 대신 미디어 파일의 URL의 새로운보기를 사용하려면 몇 가지 템플릿을 변경했지만, 지금은 의도 한대로 작동 로그되지 않은 사용자를 잠급니다.

그러나 더 이상 Apache를 사용하여 파일을 제공하지 않으며 장고 자체를 사용합니다. according to the docs은 적합하지 않으며 권장되지 않습니다.

이상적으로 당신은 여전히 ​​아파치를 사용하여 파일을 제공하고 단지의 액세스를 보호하기 위해보기를 사용하려면, 그리고 당신은 아파치 mod_xsendfile를 사용하거나 단순히 언급 된 모듈에 대한 래퍼입니다 Django Sendfile를 사용할 수 있습니다.

나는 후자를 시도했지만, 불행히도 it has problems with file names that have non-ascii characters. 필자의 목표는 스페인어를 사용하는 사용자 들로서, 적어도 당장은 장고로 파일을 제공해야했습니다.